繁体   English   中英

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

[英]Alternative to “PDO::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();

有什么选择?

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

就个人而言,我发现它非常有用,并希望我不必在其他系统上采用其他更复杂的方法。

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

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

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

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

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

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

例如:

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

你可以试试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM