在事务中插入mysql外键和主键


Inserting mysql foreign keys and primary keys in a transaction.

只是为我正在做的一个小项目寻找一些技巧和指针。我有一些想法,但我不确定它们是否是最佳实践。我使用的是mysql和php。

我在数据库中有一个名为nomsing的表。

它有一个名为row-id的主键,它是一个整数。

然后我有大约8个其他表引用了这个表。例如,它们被称为nomplu、accsing、accplu、datsing、datplu。每个列都有一个引用命名主键的列。

使用我的php代码,除了命名表的行id主键之外,我拥有要插入到表中的所有信息。因此php生成了一系列插入,如下所示。

INSERT INTO nomsing(word,postress,gender) VALUES (''велосипед","8","mask").
INSERT INTO nomplu(word,postress,NOMSING?REFERENCE) VALUES (''велосипеды","2",@the reference to the id of the first insert@).

还有更多的插件,但这一个能说明问题。第二个插入应该引用第一个插入的自动生成的id。我是作为一个事务来工作的,所以所有的插入都应该完成或者没有。

我的一个想法是不要自动生成id,而是自己在php中生成。这样可以知道事务之前给出的id,但之后我必须检查id是否已经在数据库中。

我的另一个想法是进行第一次插入,然后在php中查询该插入的行id,然后进行第二次插入。我的意思是两者都应该起作用,但它们似乎不是最佳解决方案。我不太熟悉数据库事务特性,但在这种情况下,最好的方法是什么。我不喜欢插入然后查询id,然后运行其余查询的想法。只是看起来效率很低,或者我错了。

只需在主表中插入一行即可。然后,您可以获取插入id(在PDO上时为lastInserId),并使用它来填充其他查询。

您可以使用JvdBerg提供的php版本,或者Mysql的LAST_INSERT_ID。我通常使用前一个选项。

请在此处查看类似的SO问题。

您可以向nomsing表添加一个新列,称为"insert_order"(或类似列),默认值为0,然后创建一个大容量插入语句,而不是每次插入生成一条SQL语句,例如

INSERT INTO nomsing(word,postress,gender, insert_order) 
VALUES (''велосипед","8","mask",1), (''abcd'',"9","hat",2).....

循环中的计数器从1开始生成CCD_ 2数字。然后你可以在表上执行一个SELECT来获得ID,例如

SELECT row_id
FROM   nomsing
WHERE  insert_order > 0;

现在您已经拥有了所有的ID,现在可以为以下查询进行批量插入。在脚本结束时,只需更新即可将insert_order列重置回0

UPDATE nomsing SET insert_order = 0 WHERE insert_order > 0;

添加一个额外的列来做这件事可能看起来很麻烦,但与一次执行一个查询相比,它会显著提高速度。