我的项目中有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在更新级联上引用A为删除级联。
C和D具有相同的FK工作表。
E具有FK sysNum参考A,有关删除级联,有关更新级联。
我将大量数据插入这些表中,因此选择了事务。这是我的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 。
注意:在将列添加到A之前,这5个表工作正常。我设置了foreign_key_checks = 0,并向A添加了新列。然后将foreign_key_checks = 1设置回了,但是不幸的是,E表工作失败。
我对此一无所知,谁能帮助我?
最佳答案
当以这种方式使用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中的插入。