Хотя выглядит, что последовательности эквивалентны для MySQL auto_increment, есть некоторые тонкие, но важные различия:
1. Неудачные запросы Увеличивают последовательность / серийный номер
Последовательный столбец увеличивается при неудачных запросах. Это приводит к фрагментации неудачных запросов, а не просто к удалению строк. Например, выполните следующие запросы к вашей базе данных PostgreSQL:
CREATE TABLE table1 (
uid serial NOT NULL PRIMARY KEY,
col_b integer NOT NULL,
CHECK (col_b>=0)
);
INSERT INTO table1 (col_b) VALUES(1);
INSERT INTO table1 (col_b) VALUES(-1);
INSERT INTO table1 (col_b) VALUES(2);
SELECT * FROM table1;
Вы должны получить следующий вывод:
uid | col_b
-----+-------
1 | 1
3 | 2
(2 rows)
Обратите внимание, как uid меняется с 1 на 3 вместо 1 на 2.
Это все еще происходит, если вам нужно было вручную создать собственную последовательность с помощью:
CREATE SEQUENCE table1_seq;
CREATE TABLE table1 (
col_a smallint NOT NULL DEFAULT nextval('table1_seq'),
col_b integer NOT NULL,
CHECK (col_b>=0)
);
ALTER SEQUENCE table1_seq OWNED BY table1.col_a;
Если вы хотите проверить, как MySQL отличается, запустите следующее для базы данных MySQL:
CREATE TABLE table1 (
uid int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
col_b int unsigned NOT NULL
);
INSERT INTO table1 (col_b) VALUES(1);
INSERT INTO table1 (col_b) VALUES(-1);
INSERT INTO table1 (col_b) VALUES(2);
Вы должны получить следующее с без фреймации :
+-----+-------+
| uid | col_b |
+-----+-------+
| 1 | 1 |
| 2 | 2 |
+-----+-------+
2 rows in set (0.00 sec)
2. Ручная установка значения последовательного столбца может привести к сбою будущих запросов.
Это было указано @trev в предыдущем ответе.
Чтобы смоделировать это вручную, установите для uid значение 4, которое позже будет «конфликтовать».
INSERT INTO table1 (uid, col_b) VALUES(5, 5);
Данные таблицы:
uid | col_b
-----+-------
1 | 1
3 | 2
5 | 5
(3 rows)
Запустить еще одну вставку:
INSERT INTO table1 (col_b) VALUES(6);
Данные таблицы:
uid | col_b
-----+-------
1 | 1
3 | 2
5 | 5
4 | 6
Теперь, если вы запустите другую вставку:
INSERT INTO table1 (col_b) VALUES(7);
Сбой со следующим сообщением об ошибке:
ОШИБКА: двойное значение ключа нарушает уникальное ограничение "table1_pkey"
ДЕТАЛИ: Ключ (uid) = (5) уже существует.
Напротив, MySQL будет обрабатывать это изящно, как показано ниже:
INSERT INTO table1 (uid, col_b) VALUES(4, 4);
Теперь вставьте еще одну строку без установки uid
INSERT INTO table1 (col_b) VALUES(3);
Запрос не завершается неудачей, uid просто переходит на 5:
+-----+-------+
| uid | col_b |
+-----+-------+
| 1 | 1 |
| 2 | 2 |
| 4 | 4 |
| 5 | 3 |
+-----+-------+
Тестирование проводилось на MySQL 5.6.33, для Linux (x86_64) и PostgreSQL 9.4.9