我的项目中有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中的插入。

08-06 16:43