我的项目中有5个表(A,B,C,D,E)。
表有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 REFERENCES更新级联的ON DELETE CASCADE。
我有很多数据被插入到这些表中,所以我选择了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与A的方式相同。所以C和D的sheetNum都是10.但是E的sysNum是10 ,而不是20。
注意:在我将列添加到A之前,这5个表工作正常。我设置foreign_key_checks = 0,并向A添加了一个新列。然后设置foreign_key_checks = 1,但不幸的是E表工作失败。
我不知道,谁可以帮助我?
答案 0 :(得分:2)
以这种方式使用LAST_INSERT_ID()时,您将始终从最新 SQL语句中获取值,这是您插入B的关键字。
我想你想要的是最后一个SQL语句来获得早期语句的值。当您完成A的插入时,最好存储此值。您可以使用(用于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中的插入。