Spec-Zone.ru › MariaDB

LAST_INSERT_ID

Синтаксис

LAST_INSERT_ID(), LAST_INSERT_ID(expr)

Описание

LAST_INSERT_ID() (без аргументов) возвращает первое успешно сгенерированное автоматическое значение для столбца AUTO_INCREMENT в результате последнего выполненного оператора INSERT. Значение LAST_INSERT_ID() остается неизменным, если ни одна строка не была успешно вставлена.

Если LAST_INSERT_ID() получает аргумент, то он возвращает значение выражения, и следующий вызов LAST_INSERT_ID() вернёт то же самое значение. Это значение также будет отправлено клиенту и доступно через функцию mysql_insert_id.

Например, после вставки строки, генерирующей значение AUTO_INCREMENT, вы можете получить это значение так:

SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                9 |
+------------------+

Вы также можете использовать LAST_INSERT_ID() для удаления последней вставленной строки:

DELETE FROM product WHERE id = LAST_INSERT_ID();

Если ни одна строка не была успешно вставлена, LAST_INSERT_ID() возвращает 0.

Значение LAST_INSERT_ID() будет согласованным во всех версиях, если все строки в операторе INSERT или UPDATE были успешны.

Выполняемый в данный момент оператор не влияет на значение LAST_INSERT_ID(). Предположим, что вы генерируете значение AUTO_INCREMENT одним оператором, а затем ссылаетесь на LAST_INSERT_ID() в операторе INSERT с несколькими строками, который вставляет строки в таблицу со своим столбцом AUTO_INCREMENT. Значение LAST_INSERT_ID() останется стабильным во втором операторе; его значение для второй и последующих строк не зависит от предыдущих вставок строк. (Однако, если вы смешиваете ссылки на LAST_INSERT_ID() и LAST_INSERT_ID(expr), эффект неопределён).

Если предыдущий оператор вернул ошибку, значение LAST_INSERT_ID() неопределено. Для транзакционных таблиц, если оператор откатывается из-за ошибки, значение LAST_INSERT_ID() остаётся неопределённым. При ручном ROLLBACK значение LAST_INSERT_ID() не восстанавливается до значения до начала транзакции; оно остаётся таким, каким было в момент ROLLBACK.

В теле хранимой процедуры (процедуры или функции) или триггера, значение LAST_INSERT_ID() изменяется так же, как и для операторов, выполняемых вне тела этих объектов. Влияние хранимой процедуры или триггера на значение LAST_INSERT_ID(), которое видят последующие операторы, зависит от типа процедуры:

  • Если хранимая процедура выполняет операторы, изменяющие значение LAST_INSERT_ID(), новое значение будет видно операторам, которые следуют за вызовом процедуры.
  • Для хранимых функций и триггеров, которые изменяют значение, значение восстанавливается при завершении функции или триггера, поэтому последующие операторы не увидят изменённое значение.

Примеры

CREATE TABLE t (
  id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
  f VARCHAR(1)) 
ENGINE = InnoDB;

INSERT INTO t(f) VALUES('a');

SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+

INSERT INTO t(f) VALUES('b');

INSERT INTO t(f) VALUES('c');

SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                3 |
+------------------+

INSERT INTO t(f) VALUES('d'),('e');

SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                4 |
+------------------+

SELECT * FROM t;
+----+------+
| id | f    |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
|  5 | e    |
+----+------+

SELECT LAST_INSERT_ID(12);
+--------------------+
| LAST_INSERT_ID(12) |
+--------------------+
|                 12 |
+--------------------+

SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|               12 |
+------------------+

INSERT INTO t(f) VALUES('f');

SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                6 |
+------------------+

SELECT * FROM t;
+----+------+
| id | f    |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
|  5 | e    |
|  6 | f    |
+----+------+

SELECT LAST_INSERT_ID(12);
+--------------------+
| LAST_INSERT_ID(12) |
+--------------------+
|                 12 |
+--------------------+

INSERT INTO t(f) VALUES('g');

SELECT * FROM t;
+----+------+
| id | f    |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
|  5 | e    |
|  6 | f    |
|  7 | g    |
+----+------+

См. также

  • mysql_insert_id
  • AUTO_INCREMENT
  • Обработка AUTO_INCREMENT в InnoDB
  • Последовательности - альтернатива auto_increment, доступная с MariaDB 10.3
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проходит предварительной проверки MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают взгляды MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/last_insert_id/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API