LAST_INSERT_ID() 在使用外键时被更改

LAST_INSERT_ID() is changed while using foreign key

我的项目中有 5 tables (A,B,C,D,E)。

A table 具有 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 参考 A ON DELETE CASCADE ON UPDATE CASCADE。

我有很多数据要插入这些 table,所以我选择 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为10,同A,所以C和D的sheetNum都是10。但是E 的 sysNum 是 10,不是 20。

注意:这 5 个 table 工作正常,在我将列添加到 A 之前。我设置 foreign_key_checks=0,并向 A 添加一个新列。然后设置 foreign_key_checks=1 回来了,可惜 E tables 工作失败了。

我不知道,谁能帮帮我?

当以这种方式使用 LAST_INSERT_ID() 时,您将始终从 latest SQL 语句中获取值,这是您从插入到B.
我认为您想要的是最后一个 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;

然后将此值用于 table E 中的插入。