Альтернатива "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();
Какова альтернатива?
6 answers
Если вы пойдете по маршруту ADOdb (http://adodb.sourceforge.net /), затем вы можете создать идентификатор вставки перед рукой и явно указать идентификатор при вставке. Это может быть реализовано переносимо (ADODB поддерживает множество различных баз данных...) и гарантирует, что вы используете правильный идентификатор вставки.
Тип ПОСЛЕДОВАТЕЛЬНЫХ данных PostgreSQL аналогичен, за исключением того, что он относится к таблице/последовательности, вы указываете таблицу/последовательность, для которой хотите получить идентификатор последней вставки при запросе это.
ИМХО, это считается "злом" только потому, что вряд ли какая-либо другая база данных SQL (если таковая имеется) имеет его.
Лично я нахожу это невероятно полезным и хотел бы, чтобы мне не приходилось прибегать к другим, более сложным методам в других системах.
Одной из альтернатив является использование последовательностей вместо этого, поэтому вы сами генерируете идентификатор перед вставкой.
К сожалению, они не поддерживаются в MySQL, но библиотеки, такие как Adodb, могут эмулировать их, используя другую таблицу. Я думаю, однако, что сама эмуляция будет использовать lastInsertId() или эквивалент... но, по крайней мере, у вас меньше шансов получить триггер в таблице, которая используется исключительно для последовательности
Я думаю, что это тоже не совсем современное решение, но я использую блокировки записи, чтобы убедиться, что я действительно получил последний вставленный идентификатор.
Это не сложно и неэффективно, но если вставленные вами данные содержат уникальные поля, то ВЫБОР, очевидно, может дать то, что вам нужно.
Например:
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();