Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当插入到多个表中时,解决此问题的最佳方法是什么?_Sql_Postgresql_Stored Procedures_Triggers_Sql Insert - Fatal编程技术网

Sql 当插入到多个表中时,解决此问题的最佳方法是什么?

Sql 当插入到多个表中时,解决此问题的最佳方法是什么?,sql,postgresql,stored-procedures,triggers,sql-insert,Sql,Postgresql,Stored Procedures,Triggers,Sql Insert,我不确定是否有关于这个的争论 当我阅读书籍时,建议我使用触发器跟踪插入到其他表中的内容。另一方面,我的导师使用存储过程插入到其他表中 我的问题是,哪种方法最好?或者有更好的方法吗?如果您想在表中插入数据,您只能通过存储过程而不是触发器来完成,因为触发器在运行时不能接受参数或任何东西 可以从另一个存储过程中调用存储过程,但不能直接调用触发器中的另一个触发器 所以我认为应该使用存储过程而不是触发器 有关详细信息,请访问以下链接 请回复我的答案。如果您想在表中插入数据,您只能通过存储过程而不是触发器

我不确定是否有关于这个的争论

当我阅读书籍时,建议我使用
触发器
跟踪插入到其他表中的内容。另一方面,我的导师使用
存储过程
插入到其他表中


我的问题是,哪种方法最好?或者有更好的方法吗?

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

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

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

有关详细信息,请访问以下链接


请回复我的答案。

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

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

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

有关详细信息,请访问以下链接


请回复我的答案。

你也不需要。启动一个事务,进行所有插入(先插入父表,然后插入子表),使用
COMMIT
结束事务,就完成了

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

至于触发器自动插入:您可以使用它们来记录数据,以便获取历史记录或类似信息,但不能使用它们来插入业务数据。设想一个订单及其位置:您插入订单标题(订单日期、客户编号等),但触发器如何知道订购了哪些项目?反之亦然:您插入订单位置(项目编号、价格)并希望自动创建标题,但触发器如何知道客户编号?触发器不适合这样的事情


如前所述:通常您只需要在事务中使用普通SQL,仅此而已

你也不需要。启动一个事务,进行所有插入(先插入父表,然后插入子表),使用
COMMIT
结束事务,就完成了

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

至于触发器自动插入:您可以使用它们来记录数据,以便获取历史记录或类似信息,但不能使用它们来插入业务数据。设想一个订单及其位置:您插入订单标题(订单日期、客户编号等),但触发器如何知道订购了哪些项目?反之亦然:您插入订单位置(项目编号、价格)并希望自动创建标题,但触发器如何知道客户编号?触发器不适合这样的事情


如前所述:通常您只需要在事务中使用普通SQL,仅此而已

存储过程和触发器是为执行不同任务而设计的不同工具。你在比较苹果和橙子。我建议你使用存储过程。在存储过程中,您可以使用XML进行大规模插入,您使用的是哪种DBMS?@a_horse_with_no_name我使用的是PostgreSql存储过程和触发器是用于执行不同任务的不同工具。你在比较苹果和橙子。我建议你使用存储过程。在存储过程中,您可以使用XML进行大规模插入您使用的是哪种DBMS?@a_horse_和_no_name我使用的是PostgreSql触发器插入另一个表的示例是数据更改日志触发器,它记录日志表中一个表中的所有更改。触发器插入另一个表的示例是数据更改日志触发器在日志记录表的一个表中记录所有更改。关于存储过程的部分,如果仔细设计数据库的结构,那么就不会有问题。在您的示例中,如果一个产品的某些颜色/尺寸将由许多供应商提供,我不需要担心,因为我使用的是PostgreSQL,我可以将
suppliers
列设置为json格式,并将新供应商添加到供应商的现有json数据中。但无论如何,根据你的观点,这种方法对开发来说是可以接受的吗?我的论点是,当你有关系要插入时,例如一个项目,它的ItemColor,它的ItemSize,它的ItemColorSize,它的itemcolorsizesuppliers等等,这很难表示为一个树,因为它没有层次结构。itemcolorsizes子项是itemcolors还是itemsizes?两者都有,所以这个