По умолчанию старт и приращение равны 1. Начнем с параметра ALWAYS и создадим аналог таблицы Printer_Inc, которая использовалась ранее для примеров в SQL Server:
Как видно, по умолчанию значения в столбце identity начинаются с 1 и увеличиваются с шагом 1.
Теперь попробуем вставить строку с заданным значением в столбце code:
INSERTINTO Printer_Inc VALUES
(3, 1003,'n','laser',850);
Сервер возвращает ошибку:
ERROR: Столбец "code" является столбцом идентификации со свойством GENERATED ALWAYS. В столбец "code" можно вставить только значение по умолчанию Hint: Для переопределения укажите OVERRIDING SYSTEM VALUE.
Такое поведение согласуется с поведением identity в SQL Server. Однако тут же дается совет использовать переопределение системного значения (OVERRIDING SYSTEM VALUE). Попробуем:
INSERTINTO Printer_Inc
OVERRIDING SYSTEM VALUE
VALUES(3, 1003,'n','laser',850);
"code"
"model"
"color"
"type"
"price"
1
"1000"
"y"
"jet"
600
2
"1001"
"n"
"laser"
800
3
"1003"
"n"
"laser"
850
А если, воспользовавшись этим способом, заменить строку с существующим значением в столбце code?
INSERTINTO Printer_Inc
OVERRIDING SYSTEM VALUE
VALUES(3, 1004,'n','laser',777.99);
Нет, не удается. Поскольку тут мы нарушаем ограничение первичного ключа, то получаем соответствующую ошибку.
Теперь проверим, откуда продолжится нумерация, если вставить значение не по порядку.
Если выполнить эти операторы по одному, а не в пакете, то получим:
"code"
"model"
"color"
"type"
"price"
1
"1000"
"y"
"jet"
600
2
"1001"
"n"
"laser"
800
3
"1003"
"n"
"laser"
850
10
"1010"
"n"
"laser"
777.99
4
"1004"
"y"
"jet"
6500
Таким образом, нумерация продолжится с последнего достигнутого значения последовательного счетчика, что потенциально приведет к ошибке (нарушения ограничения первичного ключа) при достижении значения 10.
Давайте теперь попробуем сдвинуть начало отсчета и заодно изменить шаг приращения для существующей таблицы:
-- Удалим последние строки для чистоты эксперимента
ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "printer_inc_pkey"SQL state: 23505Detail: Ключ "(code)=(40)" уже существует.
Т.е. PostgreSQL пытается продолжить нумерацию с последнего автоинкрементированного значения. Тогда придется передвинуть начальное значение и перезапустить identity: