Я немного смущен и новичок в PostgreSql, я думал, что serial = integer и bigserial = bigint, поэтому я смущен, почему я вижу последовательность с максимальным значением 9223372036854775807 вместо 2147483647, когда я создаю таблицу с PK это серийный номер.Почему создание таблицы с последовательным столбцом создает последовательность с максимальным значением bigint?
ответ
Как указано в the PostgreSQL 9.4 docs for Data Type SERIAL, последовательность неявно создается с использованием CREATE SEQUENCE tablename_colname_seq
без каких-либо дополнительных параметров.
documentation for CREATE SEQUENCE
говорит:
Дополнительное предложение MAXVALUEMAXVALUE определяет максимальное значение для последовательности. Если это предложение не указано или указано NO MAXVALUE, то будут использоваться значения по умолчанию. Значения по умолчанию - 2^63-1 и -1 для восходящих и нисходящих последовательностей соответственно.
Таким образом, задокументировано поведение, что последовательность создана с максимальным значением, которое вы выполняете.
Последовательность и столбец - две отдельные вещи. Последовательность может возвращать целое число, большее, чем можно сохранить в столбце int4. При указании SERIAL
или BIGSERIAL
, PostgreSQL примерно переводит, что в:
- создать INT4 или INT8 столбец
- создать последовательность
- сделать последовательность, принадлежащую колонке
- сделать значение по колонке по умолчанию в следующее значение из последовательности
SERIAL
это удобство, но нет фактического типа столбца SERIAL
.
И хотя значение maxvalue равно 64 бит, тип по-прежнему является целым числом. –
Итак, каким будет предпочтительный способ создания последовательного ключа в таблице и указать максимальное значение. Я бы предположил, что просто создайте pk на соответствующем типе и создайте последовательность самостоятельно и установите максимальное значение. – OutOFTouch
Просто используйте инструкции SQL, эквивалентные использованию SERIAL, и добавьте 'MAXVALUE 2147483647' в конце инструкции' CREATE SEQUENCE'. Если последовательность когда-либо достигнет такого максимального значения, вы все равно будете в беде. Поэтому просто оставьте как есть, и это в конечном итоге вызовет ошибку «целое вне диапазона», если исчерпаны все действительные целые числа. –