我的项目中有5个表(A,B,C,D,E)。在使用外键时更改LAST_INSERT_ID()
一个表有PK sysNum,它是int(255)NOT NULL AUTO_INCREMENT。
B有PK sheetNum,它是int(255)NOT NULL AUTO_INCREMENT,并且B有FK sysNum参考ON DELETE CASCADE ON UPDATE CASCADE。
C和D具有相同的FK sheetNum参考B在DELETE CASCADE上更新级联。
E has FK sysNum REFERENCES A ON DELETE CASCADE ON UPDATE CASCADE。
我哈瓦多的数据被插入到这些表中,所以我chosed 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();
插入到后,由AUTO_INCREMENT创建的sysNum为20,并插入到B之后,sheetNum与A的方法相同,因此C和D的sheetNum都是10.但是E的sysNum是10,而不是20.
注意:这5个表格工作正常,在添加列之前到A.我设置foreign_key_checks = 0,然后向A添加一个新列。然后设置foreign_key_checks = 1,但不幸的是E表失败。
我不知道,谁能帮我?
我试过$ id = $ conn-> insert_id;插入E(sysNum,...)值($ id,...);但是$ id是空的 – stack
刚刚插入表A之后,您是否放置了这个?更新的答案应该放在它的位置上。 –
对于PDO - 你需要在插入到A后使用'lastInsertId()'代替 –