Вопрос

Я всегда слышу это, используя " 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top