php - 使用外键时 LAST_INSERT_ID() 被更改

标签 php mysql last-insert-id

我的项目中有 5 个表(A、B、C、D、E)。

表的 PK sysNum 为 int(255) NOT NULL AUTO_INCRMENT。

B 的 PKsheetNum 为 int(255) NOT NULL AUTO_INCRMENT,并且 B 具有 FK sysNum REFERENCES A ON DELETE CASCADE ON UPDATE CASCADE。

C 和 D 具有相同的 FKsheetNum REFERENCES B ON DELETE CASCADE ON UPDATE CASCADE。

E 具有 FK sysNum REFERENCES A ON DELETE CASCADE ON UPDATE CASCADE。

我有很多数据要插入到这些表中,所以我选择了事务。这是我的 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后,与A相同,sheetNum为10。所以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 的 key 。
我认为你想要的是最后一个 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;

然后使用该值在表 E 中插入。

关于php - 使用外键时 LAST_INSERT_ID() 被更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46069461/

相关文章:

php - Openshift MySQL 5.5 上的 Joomla 3.5.1 内存不足

mysql - Perl 和 MySQL - 使用 DBI 可能与 last_insert_id 返回表最后一行的字段?

mysql - 如何使用nifi在mysql中获取最后插入的记录

php - 如何忽略 myIsam 插入忽略时自动增加的主 id?

php - PHP中的die()和exit()有什么区别?

php - 在 laravel 外观上使用依赖注入(inject)

mysql - 我怎样才能进一步优化这个?

mysql在多条记录的选择查询中通过id获取名称

php - 如何获取 Codeigniter 中模型之间事务关系的最后一个 id?

php - 如何显示连接到数据库的表单搜索结果?