Альтернатива «PDO :: lastInsertId» / «mysql_insert_id»
-
08-07-2019 - |
Вопрос
Я всегда слышу это, используя " lastInsertId " (или mysql_insert_id (), если вы не используете PDO) это зло. В случае триггеров это очевидно, потому что он может вернуть что-то, что не является последним идентификатором, который создал ваш INSERT.
$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();
Какая альтернатива?
Решение
Если вы идете по пути ADOdb ( http://adodb.sourceforge.net/ ), затем вы можете создать идентификатор вставки перед рукой и явно указать идентификатор при вставке. Это может быть реализовано переносимо (ADOdb поддерживает множество различных баз данных ...) и гарантирует, что вы используете правильный ID вставки. Р>
Тип данных PostgreSQL SERIAL аналогичен, за исключением того, что для каждой таблицы / последовательности вы указываете таблицу / последовательность, для которой вы хотите использовать последний идентификатор вставки, когда запрашиваете его. Р>
Другие советы
ИМХО, это только считается "злом" потому что вряд ли какая-либо другая база данных SQL (если есть) имеет ее.
Лично я нахожу это невероятно полезным и хочу, чтобы мне не пришлось прибегать к другим более сложным методам в других системах.
Одной из альтернатив является использование последовательностей, поэтому вы сами генерируете идентификатор, прежде чем выполнять вставку.
К сожалению, они не поддерживаются в MySQL, но такие библиотеки, как Adodb, могут эмулировать их, используя другую таблицу. Я думаю, однако, что сама эмуляция будет использовать lastInsertId () или эквивалентный ... но, по крайней мере, у вас меньше шансов иметь триггер для таблицы, которая используется исключительно для последовательности
Я полагаю, что это не совсем современный уровень, но я использую блокировки записи, чтобы убедиться, что я действительно получил последний вставленный идентификатор.
Это не сложно и не эффективно, но если данные, которые вы вставили, содержат уникальные поля, тогда 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();