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

时间:2012-09-03 09:55:39

标签: php mysql transactions

只是为我正在做的小项目寻找一些提示和指示。我有一些想法,但我不确定它们是否是最好的做法。我正在使用mysql和php。

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

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

然后我有大约8个引用该表的其他表。 这被称为nomplu,accsing,accplu,datsing,datplu。 每个都有一个引用nomsing主键的列。

使用我的php代码,我将所有信息都插入到表中,除了一件事,nomsing表的行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是否已经在db中。

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你可以使用JvdBerg或Mysql的LAST_INSERT_ID给出的php版本。我通常使用前一种选择。

查看类似的SO问题here

答案 2 :(得分:0)

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

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

你从循环中的一个计数器开始生成insert_order数字。然后,您可以在表格上执行一个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;

添加额外的列来执行此操作可能看起来很麻烦,但它会比一次执行一个查询时显着增加速度。