“PDO :: lastInsertId”/“mysql_insert_id”的替代方案

时间:2008-11-14 12:19:16

标签: php mysql auto-increment lastinsertid mysql-insert-id

我总是听说使用“lastInsertId”(或者如果你不使用PDO,则使用mysql_insert_id())是邪恶的。在触发器的情况下,它显然是,因为它可以返回一些完全不是INSERT创建的最后一个ID。

$DB->exec("INSERT INTO example (column1) VALUES ('test')");
// Usually returns your newly created ID.
// However when a TRIGGER inserts into another table with auto-increment:
// -> Returns newly created ID of trigger's INSERT
$id = $DB->lastInsertId();

有什么替代方案?

6 个答案:

答案 0 :(得分:4)

恕我直言,它只被认为是“邪恶的”,因为几乎没有任何其他SQL数据库(如果有的话)拥有它。

我个人认为它非常有用,并且希望我不必在其他系统上使用其他更复杂的方法。

答案 1 :(得分:3)

另一种方法是使用序列,因此在插入之前自己生成ID。

不幸的是,MySQL不支持它们,但像Adodb这样的库可以使用另一个表来模拟它们。然而,我认为仿真本身将使用lastInsertId()或等效...但至少你不太可能在一个纯粹用于序列的表上有一个触发器

答案 2 :(得分:2)

如果你走ADOdb(http://adodb.sourceforge.net/)的路线,那么你可以在手动之前创建插入ID ,并在插入时明确指定ID。这可以移植实现(ADOdb支持大量不同的数据库......)并保证您使用正确的插入ID。

PostgreSQL SERIAL数据类型类似,只是它是每个表/每个序列,您指定要求它的最后一个插入ID的表/序列。

答案 3 :(得分:1)

我想这不是最先进的技术,但我使用写锁来确保我真的得到最后插入的ID。

答案 4 :(得分:0)

它不复杂而且效率不高,但如果您插入的数据包含唯一字段,那么SELECT显然可以产生您所追求的内容。

例如:

INSERT INTO example (column1) VALUES ('test');
SELECT id FROM example WHERE column1 = 'test';

答案 5 :(得分:-3)

你可以试试这个:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();