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
© 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/