使用外键时更改LAST_INSERT_ID()

时间:2017-09-06 07:41:06

标签: php mysql last-insert-id

我的项目中有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表工作失败。

我不知道,谁可以帮助我?

1 个答案:

答案 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中的插入。