在我的数据库中使用两个表并将一个HTML表单的数据拆分为两个不同的查询,我遇到了一个问题,从第一个查询中识别主键以用作第二个查询中的外键。这是我在伪代码中谈论的内容:
$FormData1, $FormData2, ... INSERT INTO table1 //primary key is auto-generated int
$key = SELECT primaryKey FROM table1 WHERE *** Uh-oh!
$otherFormData1, $otherFormData2, $key ... INSERT INTO table2
鉴于系统需要设计为可以发生并发事务,我该如何解决此问题?如果我知道它一次只会运行一个实例,那么我可以查询添加的最后一条记录,但我觉得这不是解决我问题的非常"整洁"(甚至安全)的解决方案。
您可以查询LAST_INSERT_ID()
,但您可以使用mysqli::insert_id
和PDO::lastInsertId
方法。 请注意,这些是每个连接,因此即使您同时从单独的请求中进行了许多插入,也可以安全地进行查询。
触发
插入SQL后的MySQL和MySQLli具有刚刚插入的记录的$insert_ID - 您无需查询数据库。你可以使用这个:
$sql = 'INSERT INTO table1 (field1, field2) VALUES ("aaa", "bbb")';
$mysqli = new mysqli();
$mysqli->query($sql);
$pKey = $mysqli->insert_id;
现在,您的$pKey具有您刚刚插入的行的 id 值。
(请参阅此处了解更多信息:http://pl1.php.net/manual/en/mysqli.insert-id.php)