Альтернатива "PDO:: lastInsertId" / " mysql insert id"

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


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

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


IMHO это считается только "злом", потому что вряд ли какая-либо другая база данных 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();