我总是听说使用“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();
有什么替代方案?
答案 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();