Альтернатива "PDO::lastInsertId"/"идентификатор вставки mysql"


Я всегда слышу, что использование "lastInsertId" (или mysql_insert_id(), если вы не используете PDO) - это зло. В случае триггеров это, очевидно, так, потому что он может возвращать что-то, что совершенно не является последним идентификатором, созданным вашей ВСТАВКОЙ.

$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();

Какова альтернатива?

Author: BlaM, 2008-11-14

6 answers

Если вы пойдете по маршруту ADOdb (http://adodb.sourceforge.net /), затем вы можете создать идентификатор вставки перед рукой и явно указать идентификатор при вставке. Это может быть реализовано переносимо (ADODB поддерживает множество различных баз данных...) и гарантирует, что вы используете правильный идентификатор вставки.

Тип ПОСЛЕДОВАТЕЛЬНЫХ данных PostgreSQL аналогичен, за исключением того, что он относится к таблице/последовательности, вы указываете таблицу/последовательность, для которой хотите получить идентификатор последней вставки при запросе это.

 2
Author: Keith Palmer Jr., 2008-11-14 13:41:49

ИМХО, это считается "злом" только потому, что вряд ли какая-либо другая база данных SQL (если таковая имеется) имеет его.

Лично я нахожу это невероятно полезным и хотел бы, чтобы мне не приходилось прибегать к другим, более сложным методам в других системах.

 4
Author: Alnitak, 2008-11-14 13:08:49

Одной из альтернатив является использование последовательностей вместо этого, поэтому вы сами генерируете идентификатор перед вставкой.

К сожалению, они не поддерживаются в MySQL, но библиотеки, такие как Adodb, могут эмулировать их, используя другую таблицу. Я думаю, однако, что сама эмуляция будет использовать lastInsertId() или эквивалент... но, по крайней мере, у вас меньше шансов получить триггер в таблице, которая используется исключительно для последовательности

 3
Author: Tom Haigh, 2008-11-14 13:42:58

Я думаю, что это тоже не совсем современное решение, но я использую блокировки записи, чтобы убедиться, что я действительно получил последний вставленный идентификатор.

 1
Author: markus, 2008-11-14 12:31:49

Это не сложно и неэффективно, но если вставленные вами данные содержат уникальные поля, то ВЫБОР, очевидно, может дать то, что вам нужно.

Например:

INSERT INTO example (column1) VALUES ('test');
SELECT id FROM example WHERE column1 = 'test';
 0
Author: Peter Howe, 2008-11-14 12:28:33

Вы могли бы попробовать это:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();
 -3
Author: mikeyD, 2012-07-17 12:50:20