只是为我正在做的一个小项目寻找一些技巧和指针。我有一些想法,但我不确定它们是否是最佳实践。我使用的是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;
添加一个额外的列来做这件事可能看起来很麻烦,但与一次执行一个查询相比,它会显著提高速度。