我的项目中有 5 个表(A、B、C、D、E)。
表的 PK sysNum 为 int(255) NOT NULL AUTO_INCRMENT。
B 的 PKsheetNum 为 int(255) NOT NULL AUTO_INCRMENT,并且 B 具有 FK sysNum REFERENCES A ON DELETE CASCADE ON UPDATE CASCADE。
C 和 D 具有相同的 FKsheetNum REFERENCES B ON DELETE CASCADE ON UPDATE CASCADE。
E 具有 FK sysNum REFERENCES A ON DELETE CASCADE ON UPDATE CASCADE。
我有很多数据要插入到这些表中,所以我选择了事务。这是我的 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后,与A相同,sheetNum为10。所以C和D的sheetNum都是10。但E的sysNum是10 ,不是 20。
注意:在我向 A 添加列之前,这 5 个表工作正常。我设置了foreign_key_checks=0,并向 A 添加了一个新列。然后设置了foreign_key_checks=1,但不幸的是 E 表工作失败。
我不知道,谁能帮帮我?
最佳答案
以这种方式使用 LAST_INSERT_ID() 时,您将始终从最新 SQL 语句中获取值,这是插入 B 的 key 。
我认为你想要的是最后一个 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;
然后使用该值在表 E 中插入。
关于php - 使用外键时 LAST_INSERT_ID() 被更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46069461/