【问题标题】:When inserting to multiple tables, what is the best approach for this matter?插入多个表时,解决此问题的最佳方法是什么?
【发布时间】:2016-05-19 05:12:54
【问题描述】:

我不确定这是否存在争议。

当我阅读书籍时,建议我使用triggers 来跟进插入到其他表格中的内容。另一方面,我的导师使用stored procedures 插入到其他表中。

我的问题是,哪种方法最好?还是有更好的办法?

【问题讨论】:

  • 存储过程和触发器是旨在执行不同任务的不同工具。你在比较苹果和橘子。
  • 我建议你使用存储过程。在存储过程中,您可以使用 XML 进行批量插入
  • 您使用的是哪个 DBMS?
  • @a_horse_with_no_name 我正在使用 PostgreSQL

标签: sql postgresql stored-procedures triggers sql-insert


【解决方案1】:

如果你想在表上插入数据,你只能通过存储过程而不是触发器来完成,因为触发器在运行时不能接受参数或任何东西。

您可以从另一个存储过程中调用一个存储过程,但不能直接在触发器中调用另一个触发器。

所以我认为你应该使用存储过程而不是触发器

详情请访问以下链接。

http://www.codeproject.com/Tips/624566/Differences-between-a-Stored-Procedure-and-a-Trigg

请回复我的答案。

【讨论】:

  • 将触发器插入另一个表的示例是数据更改日志记录触发器,该触发器将一个表中的所有更改记录在日志表中。
【解决方案2】:

你也不需要。开始一个事务,进行所有插入(先父表,后子表),以COMMIT 结束事务,就完成了。

如果您想捆绑存储过程并确保某种一致性(例如,父表始终至少有一个子表),请使用存储过程。但这可能会变得复杂。假设您要插入具有所有颜色、尺寸、供应商和销售市场的新产品。某些颜色/尺寸将由一个或多个供应商而不是其他供应商提供,与销售市场相同。为了显示这些关系,我们通常使用表格,但现在您必须以某种方式将它们放入参数中,以便将它们插入表格中。有人告诉我,有些人将所有的数据库写入都写在程序中。这可能是可能的,但有其局限性。

关于触发器的自动插入:您可以使用它们来记录数据,以获取历史记录等,但您不能使用它们来插入业务数据。考虑一个带有位置的订单:您插入了订单标题(订单日期、客户编号……),但触发器如何知道订购了哪些商品?反之亦然:您插入一个订单位置(项目编号、价格)并希望自动创建标题,但触发器如何知道客户编号?触发器不适用于此类事情。

如前所述:通常您只需在事务中使用纯 SQL 即可。

【讨论】:

  • 关于存储过程的部分,如果仔细设计数据库的结构,那就没有问题了。在您的示例中,有关产品的某些颜色/尺寸将由许多供应商提供的情况,我不需要担心,因为我使用的是 PostgreSQL,我可以将 suppliers 列以 json 格式和将新的供应商添加到供应商的现有 json 数据中。但无论如何,根据您的看法,这种方法对于开发来说是否可以接受?
  • 我的论点是当你有关系要插入时,例如一个项目,它的 itemcolors,它的 itemsizes,它的 itemcolorsizes,它的 itemcolorsizesuppliers 等等,这很难用树来表示,因为它没有层次结构。 itemcolorsizes 是 itemcolors 或 itemsizes 的子项吗?两者兼而有之,因此这不再是分层树。这就是您使用数据库的原因。它可以用关系对象表示,因此我猜是 JSON,但这很复杂。仅使用插入语句而不是必须为 ... 构建关系结构化参数会容易得多
  • ... 超级插入程序。当然,您可以将其拆分为单独的函数 fn_insert_item、fn_insert_itemcolor、fn_insert_itemsize,但是这样您就失去了存储过程相对于单个插入的优势。然而,这是一个极端的例子,只是为了显示限制。是的,使用存储过程写入数据库是一种有效的方法。而且存储过程支持越丰富越好。据我所知,使用 PL/pgSQL PostgreSQL 提供了丰富的语言。所以这似乎是一个很好的方法......
  • ... 但是,我不知道 PL/pgSQL 有多好。在 Oracle 的 PL/SQL 中,您可以拥有包含函数的包,因此您确实会有单独的函数,一个用于添加项目,一个用于为项目添加尺寸,一个用于添加颜色等,然后​​是一个用于验证的最终函数所有这些数据并写入。所以不需要关系参数结构。该包将单个功能关联起来,让您逐步添加数据。我不知道 Postgre 的 PL/pgSQL 是否可行。所以我的最终答案应该是:对于 Oracle 来说是一个非常好的方法,对于 PostgreSQL 来说可能也是一个好方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2022-12-07
  • 1970-01-01
相关资源
最近更新 更多