Php 在事务中插入mysql外键和主键。
只是为我正在做的一个小项目寻找一些提示和指针。我有一些想法,但我不确定它们是否是最佳实践。我正在使用mysql和php 数据库中有一个名为nomsing的表 它有一个名为row id的主键,它是一个整数 然后我有大约8个其他表引用这个表。 例如,它们被称为nomplu,accing,accplu,datsing,datplu。 每个都有一列引用nomsing的主键 使用我的php代码,除了一件事,即nomsing表的row id主键之外,我拥有所有要插入到表中的信息。因此php生成一系列插入,如下所示Php 在事务中插入mysql外键和主键。,php,mysql,transactions,Php,Mysql,Transactions,只是为我正在做的一个小项目寻找一些提示和指针。我有一些想法,但我不确定它们是否是最佳实践。我正在使用mysql和php 数据库中有一个名为nomsing的表 它有一个名为row id的主键,它是一个整数 然后我有大约8个其他表引用这个表。 例如,它们被称为nomplu,accing,accplu,datsing,datplu。 每个都有一列引用nomsing的主键 使用我的php代码,除了一件事,即nomsing表的row 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,然后运行其余查询的想法。似乎效率很低,或者我错了。只需在主表中插入一行即可。然后您可以获取(在PDO上时)并使用它来填充其他查询。您可以使用JvdBerg或Mysql提供的php版本。我通常使用前者
查看类似的SO问题。您可以在
命名表中添加一个名为“insert_order”(或类似)的新列,默认值为0,然后创建一个批量插入语句,而不是每次插入生成一个SQL语句,例如
INSERT INTO nomsing(word,postress,gender, insert_order)
VALUES (''велосипед","8","mask",1), (''abcd'',"9","hat",2).....
在循环中从1开始的计数器生成insert\u order
编号。然后,您可以在表上执行一次选择,以获取ID,例如
SELECT row_id
FROM nomsing
WHERE insert_order > 0;
现在您拥有了所有的ID,现在可以为以下查询执行批量插入。在脚本结束时,只需执行更新,将insert\u order
列重置为0
UPDATE nomsing SET insert_order = 0 WHERE insert_order > 0;
添加一个额外的列来执行此操作可能看起来很麻烦,但与一次执行一个查询相比,这将大大提高速度 选中此项:在事务new中。插入表中的PK\u字段\u name\u
将返回当前会话最后插入的id。因此,您可以在手动创建的事务中使用它。我不知道这是否是你想要的,但希望能有所帮助。顺便说一下,您的查询中有语法错误。这看起来很好。非常感谢。您知道这个mysql\u insert\u id函数是否是线程安全的吗。我的意思是,如果一个用户调用insert,然后在一瞬间调用另一个用户。然后,当第一个用户调用get ID时,它会从第二个用户那里获取insert的ID。是的,这些查询只是用来解释这个想法的伪查询。我有点傻。什么是PDO?在PHP上,有三种访问MySQL数据的常用方法:MySQL(已弃用)mysqli和PDO。PDO是您最喜欢的新项目选择。