2

只是为我正在做的一个小项目寻找一些提示和指示。我有一些想法,但我不确定它们是否是最佳实践。我正在使用 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 是否已经在数据库中。

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

4

3 回答 3

1

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

于 2012-09-03T10:03:54.510 回答
0

您可以使用 JvdBerg 或 Mysql 的LAST_INSERT_ID给出的 php 版本。我通常使用前一个选项。

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

于 2012-09-03T10:26:03.657 回答
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;

添加一个额外的列来执行此操作似乎很麻烦,但与一次执行一个查询相比,它会显着提高速度。

于 2012-09-03T10:59:04.240 回答