LAST_INSERT_ID() 在使用外键时被更改
LAST_INSERT_ID() is changed while using foreign key
我的项目中有 5 tables (A,B,C,D,E)。
A table 具有 PK sysNum,它是 int(255) NOT NULL AUTO_INCREMENT。
B 有 PK sheetNum,它是 int(255) NOT NULL AUTO_INCREMENT,B 有 FK sysNum REFERENCES A ON DELETE CASCADE ON UPDATE CASCADE。
C 和 D 具有相同的 FK sheetNum REFERENCES B ON DELETE CASCADE ON UPDATE CASCADE。
E 有 FK sysNum 参考 A ON DELETE CASCADE ON UPDATE CASCADE。
我有很多数据要插入这些 table,所以我选择 transaction.Here 是我的 PHP 代码:
$conn->beginTransaction();
......
$query="insert into A( ) VALUES ();";
$stmt=$conn->query($query);
$stmt->closeCursor();
$query="insert into B (...,sysNum) VALUES(...,LAST_INSERT_ID());
insert into C (...,sheetNum) VALUES(...,LAST_INSERT_ID());
insert into D (...,sheetNum) VALUES(...,LAST_INSERT_ID());";
$stmt=$conn->query($query);
$stmt->closeCursor();
for($i=5;$i<$eRN;$i++)
{
......
$query="insert into C (...,sheetNum) VALUES (...,LAST_INSERT_ID());";
$stmt=$conn->query($query);
$stmt->closeCursor();
}
for($i=1;$i<$dRN;$i++)
{
......
$query="insert into D (...,sheetNum) VALUES (...,LAST_INSERT_ID());";
$stmt=$conn->query($query);
$stmt->closeCursor();
}
...
$query="insert into E (sysNum,...) VALUES (LAST_INSERT_ID(),...);";
$stmt=$conn->query($query);
$stmt->closeCursor();
$query="insert into E (sysNum,...) values (LAST_INSERT_ID(),...);";
$stmt=$conn->query($query);
$stmt->closeCursor();
$conn->commit();
插入到A后,auto_increment创建的sysNum为20,插入到B后,sheetNum为10,同A,所以C和D的sheetNum都是10。但是E 的 sysNum 是 10,不是 20。
注意:这 5 个 table 工作正常,在我将列添加到 A 之前。我设置 foreign_key_checks=0,并向 A 添加一个新列。然后设置 foreign_key_checks=1 回来了,可惜 E tables 工作失败了。
我不知道,谁能帮帮我?
当以这种方式使用 LAST_INSERT_ID() 时,您将始终从 latest SQL 语句中获取值,这是您从插入到B.
我认为您想要的是最后一个 SQL 语句,它具有先前语句的值。当你完成 A 的插入时,你最好存储这个值。你可以使用 (for PDO)
$query="insert into A( ) VALUES ();";
$stmt=$conn->query($query);
$id = Sconn->lastInsertId();
对于 mysqli...
$query="insert into A( ) VALUES ();";
$stmt=$conn->query($query);
$id = Sconn->insert_id;
然后将此值用于 table E 中的插入。
我的项目中有 5 tables (A,B,C,D,E)。
A table 具有 PK sysNum,它是 int(255) NOT NULL AUTO_INCREMENT。
B 有 PK sheetNum,它是 int(255) NOT NULL AUTO_INCREMENT,B 有 FK sysNum REFERENCES A ON DELETE CASCADE ON UPDATE CASCADE。
C 和 D 具有相同的 FK sheetNum REFERENCES B ON DELETE CASCADE ON UPDATE CASCADE。
E 有 FK sysNum 参考 A ON DELETE CASCADE ON UPDATE CASCADE。
我有很多数据要插入这些 table,所以我选择 transaction.Here 是我的 PHP 代码:
$conn->beginTransaction();
......
$query="insert into A( ) VALUES ();";
$stmt=$conn->query($query);
$stmt->closeCursor();
$query="insert into B (...,sysNum) VALUES(...,LAST_INSERT_ID());
insert into C (...,sheetNum) VALUES(...,LAST_INSERT_ID());
insert into D (...,sheetNum) VALUES(...,LAST_INSERT_ID());";
$stmt=$conn->query($query);
$stmt->closeCursor();
for($i=5;$i<$eRN;$i++)
{
......
$query="insert into C (...,sheetNum) VALUES (...,LAST_INSERT_ID());";
$stmt=$conn->query($query);
$stmt->closeCursor();
}
for($i=1;$i<$dRN;$i++)
{
......
$query="insert into D (...,sheetNum) VALUES (...,LAST_INSERT_ID());";
$stmt=$conn->query($query);
$stmt->closeCursor();
}
...
$query="insert into E (sysNum,...) VALUES (LAST_INSERT_ID(),...);";
$stmt=$conn->query($query);
$stmt->closeCursor();
$query="insert into E (sysNum,...) values (LAST_INSERT_ID(),...);";
$stmt=$conn->query($query);
$stmt->closeCursor();
$conn->commit();
插入到A后,auto_increment创建的sysNum为20,插入到B后,sheetNum为10,同A,所以C和D的sheetNum都是10。但是E 的 sysNum 是 10,不是 20。
注意:这 5 个 table 工作正常,在我将列添加到 A 之前。我设置 foreign_key_checks=0,并向 A 添加一个新列。然后设置 foreign_key_checks=1 回来了,可惜 E tables 工作失败了。
我不知道,谁能帮帮我?
当以这种方式使用 LAST_INSERT_ID() 时,您将始终从 latest SQL 语句中获取值,这是您从插入到B.
我认为您想要的是最后一个 SQL 语句,它具有先前语句的值。当你完成 A 的插入时,你最好存储这个值。你可以使用 (for PDO)
$query="insert into A( ) VALUES ();";
$stmt=$conn->query($query);
$id = Sconn->lastInsertId();
对于 mysqli...
$query="insert into A( ) VALUES ();";
$stmt=$conn->query($query);
$id = Sconn->insert_id;
然后将此值用于 table E 中的插入。