Разница между возвратом ключа автоматического увеличения и идентификатором последней вставки в SQL

#sql #mariadb #last-insert-id #sql-returning

#sql #mariadb #last-insert-id #sql-возврат

Вопрос:

В нашей кодовой базе мы используем два разных способа получения ключа автоматического увеличения только что вставленной строки:

  1. INSERT ... RETURNING id
  2. SELECT LAST_INSERT_ID()

Где id находится INT UNSIGNED NOT NULL AUTO_INCREMENT , когда создается. Оба обычно возвращают одно и то же значение — проверяется с помощью первого, затем выполняется второе и сравниваются возвращаемые значения — но помимо очевидной разницы, которая RETURNING может возвращать несколько строк при вставке нескольких строк, и что это позволяет возвращать больше, чем просто ключевой столбец, с целью извлечения вставленного autoувеличенный ключ, каковы практические различия между ними?

Может быть важно знать, что это таблица InnoDB в MariaDB.

Ответ №1:

Первый определенно возвращает идентификатор вставленной строки. Второй может возвращать идентификатор другой строки, если между и была вставлена другая строка INSERT SELECT .

Комментарии:

1. Интересно. Но поскольку я использую транзакции для всех вставок, возможно ли это по-прежнему? Я немедленно вызываю LAST_INSERT_ID — или лучше, я использую для этого библиотеку драйверов (я считаю, что она автоматически вызывается при каждом запросе), произойдет ли это?

Ответ №2:

INSERT . . . RETURNING намного более гибкий:

  • Если хотите, он возвращает несколько выражений, поэтому вы можете возвращать больше значений из вставленной строки, чем просто автоматически увеличенный идентификатор.
  • Он возвращает несколько строк.

LAST_INSERT_ID() на самом деле предназначен для однорядных вставок и просто возвращает один идентификатор. Я рекомендую использовать INSERT . . . RETURNING .

Комментарии:

1. Я уточнил в вопросе, что вставка нескольких строк является очевидной разницей

Ответ №3:

В случае вставки нескольких строк функция INSERT-RETURNING вернет все идентификаторы, которые были вставлены, тогда как LAST_INSERTED_ID() вернет только один

Комментарии:

1. Я уточнил в вопросе, что вставка нескольких строк является очевидной разницей