ЧАВО по AUTO_INCREMENT
Как получить значение последнего вставленного автоинкремента?
Используйте функцию LAST_INSERT_ID():
SELECT LAST_INSERT_ID();
Что делать, если кто-то другой вставит данные до того, как я получу своё ID?
LAST_INSERT_ID() зависит от соединения, поэтому проблем с гонкой ресурсов нет.
Как получить следующее значение для вставки?
Не нужно. Сделайте вставку, а затем узнайте результат с помощью LAST_INSERT_ID().
Как изменить начальное значение автоинкремента?
ALTER TABLE yourTable AUTO_INCREMENT = x; — Следующая вставка будет содержать x или MAX(autoField) + 1, в зависимости от большего значения.
или
INSERT INTO yourTable (autoField) VALUES (x); — Следующая вставка будет содержать x+1 или MAX(autoField) + 1, в зависимости от большего значения.
Выполнение TRUNCATE TABLE удалит все строки в таблице и в большинстве случаев сбросит значение автоинкремента до 0 (в некоторых ранних версиях TRUNCATE был реализован как DELETE для таблиц InnoDB, что означает, что значение автоинкремента не будет сброшено).
Как пересчитать строки после удаления некоторых из них посередине?
Обычно этого не нужно делать. Пропуски в последовательности практически никогда не создают проблем; если ваше приложение не может работать с пропущенными значениями, возможно, стоит пересмотреть ваше приложение.
Можно ли сделать автоинкремент по группам?
Да, если вы используете движок MyISAM.
Как получить значение автоинкремента в триггере BEFORE INSERT?
Нельзя. Оно доступно только после вставки.
Как присвоить два поля одинаковому значению автоинкремента в одном запросе?
Нельзя, даже с триггером AFTER INSERT. Сделайте вставку, а затем вернитесь и обновите используя LAST_INSERT_ID(). Эти два оператора могут быть объединены в одну хранимую процедуру, если вы этого хотите.
Однако, вы можете смоделировать это поведение с помощью триггера BEFORE INSERT и второй таблицы для хранения позиции в последовательности:
CREATE TABLE sequence (table_name VARCHAR(255), position INT UNSIGNED);
INSERT INTO sequence VALUES ('testTable', 0);
CREATE TABLE testTable (firstAuto INT UNSIGNED, secondAuto INT UNSIGNED);
DELIMITER //
CREATE TRIGGER testTable_BI BEFORE INSERT ON testTable FOR EACH ROW BEGIN
UPDATE sequence SET position = LAST_INSERT_ID(position + 1) WHERE table_name = 'testTable';
SET NEW.firstAuto = LAST_INSERT_ID();
SET NEW.secondAuto = LAST_INSERT_ID();
END//
DELIMITER ;
INSERT INTO testTable VALUES (NULL, NULL), (NULL, NULL);
SELECT * FROM testTable;
+-----------+------------+
| firstAuto | secondAuto |
+-----------+------------+
| 1 | 1 |
| 2 | 2 |
+-----------+------------+
Одна и та же таблица последовательности может поддерживать отдельные последовательности для нескольких таблиц (или отдельные последовательности для разных полей в одной таблице) путем добавления дополнительных строк.
Поле автоинкремента обязательно должно быть первичным ключом?
Нет, оно только должно быть индексировано. Оно даже не обязательно должно быть уникальным.
InnoDB и AUTO_INCREMENT
См. обработку AUTO_INCREMENT в InnoDB
Общая информация для чтения
Примечания к руководству
В таблице может быть только одно AUTO_INCREMENT поле, оно должно быть индексировано и не может иметь DEFAULT значение. Поле AUTO_INCREMENT работает корректно только если содержит только положительные значения. Вставка отрицательного числа рассматривается как вставка очень большого положительного числа. Это делается для предотвращения проблем с точностью, когда числа переходят от положительных к отрицательным, а также для того, чтобы случайно не получить поле AUTO_INCREMENT, содержащее 0.
Как начать таблицу с заданным значением AUTO_INCREMENT?
CREATE TABLE autoinc_test ( h INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, m INT UNSIGNED ) AUTO_INCREMENT = 100; INSERT INTO autoinc_test ( m ) VALUES ( 1 ); SELECT * FROM autoinc_test; +-----+------+ | h | m | +-----+------+ | 100 | 1 | +-----+------+
См. также
- AUTO_INCREMENT
- Обработка AUTO_INCREMENT в XtraDB/InnoDB
- LAST_INSERT_ID()
- BLACKHOLE и AUTO_INCREMENT
- Последовательности - альтернатива автоинкременту, доступная начиная с MariaDB 10.3
Первоначальная версия этой статьи была скопирована с разрешения с http://hashmysql.org/wiki/Autoincrement_FAQ 05.10.2012.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/auto_increment-faq/