Альтернатива "PDO :: lastInsertId" / "mysql_insert_id" - PullRequest
6 голосов
/ 14 ноября 2008

Я всегда слышу, что использование 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();

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

Ответы [ 6 ]

4 голосов
/ 14 ноября 2008

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

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

3 голосов
/ 14 ноября 2008

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

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

2 голосов
/ 14 ноября 2008

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

Тип данных PostgreSQL SERIAL аналогичен, за исключением того, что он для каждой таблицы / последовательности, вы указываете таблицу / последовательность, для которой вы хотите использовать последний идентификатор вставки, когда запрашиваете его.

1 голос
/ 14 ноября 2008

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

0 голосов
/ 17 июля 2012

Вы можете попробовать это:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();
0 голосов
/ 14 ноября 2008

Это не сложно и не эффективно, но если данные, которые вы вставили, содержат уникальные поля, тогда SELECT может дать то, что вам нужно.

Например:

INSERT INTO example (column1) VALUES ('test');
SELECT id FROM example WHERE column1 = 'test';
...