6

我总是听说使用“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();

有什么选择?

4

6 回答 6

4

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

我个人觉得它非常有用,并希望我不必在其他系统上求助于其他更复杂的方法。

于 2008-11-14T13:08:49.717 回答
3

一种替代方法是改用序列,因此您在插入之前自己生成 ID。

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

于 2008-11-14T13:42:58.493 回答
2

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

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

于 2008-11-14T13:41:49.463 回答
1

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

于 2008-11-14T12:31:49.823 回答
0

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

例如:

INSERT INTO example (column1) VALUES ('test');
SELECT id FROM example WHERE column1 = 'test';
于 2008-11-14T12:28:33.277 回答
-3

你可以试试这个:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();
于 2012-07-17T12:50:20.290 回答