Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在事务中插入mysql外键和主键。_Php_Mysql_Transactions - Fatal编程技术网

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

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生成一系列插入,如

只是为我正在做的一个小项目寻找一些提示和指针。我有一些想法,但我不确定它们是否是最佳实践。我正在使用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是您最喜欢的新项目选择。