2017-02-20 15 views
0

Я немного смущен и новичок в PostgreSql, я думал, что serial = integer и bigserial = bigint, поэтому я смущен, почему я вижу последовательность с максимальным значением 9223372036854775807 вместо 2147483647, когда я создаю таблицу с PK это серийный номер.Почему создание таблицы с последовательным столбцом создает последовательность с максимальным значением bigint?

ответ

1

Как указано в 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 для восходящих и нисходящих последовательностей соответственно.

Таким образом, задокументировано поведение, что последовательность создана с максимальным значением, которое вы выполняете.

+0

И хотя значение maxvalue равно 64 бит, тип по-прежнему является целым числом. –

+0

Итак, каким будет предпочтительный способ создания последовательного ключа в таблице и указать максимальное значение. Я бы предположил, что просто создайте pk на соответствующем типе и создайте последовательность самостоятельно и установите максимальное значение. – OutOFTouch

+0

Просто используйте инструкции SQL, эквивалентные использованию SERIAL, и добавьте 'MAXVALUE 2147483647' в конце инструкции' CREATE SEQUENCE'. Если последовательность когда-либо достигнет такого максимального значения, вы все равно будете в беде. Поэтому просто оставьте как есть, и это в конечном итоге вызовет ошибку «целое вне диапазона», если исчерпаны все действительные целые числа. –

0

Последовательность и столбец - две отдельные вещи. Последовательность может возвращать целое число, большее, чем можно сохранить в столбце int4. При указании SERIAL или BIGSERIAL, PostgreSQL примерно переводит, что в:

  1. создать INT4 или INT8 столбец
  2. создать последовательность
  3. сделать последовательность, принадлежащую колонке
  4. сделать значение по колонке по умолчанию в следующее значение из последовательности

SERIAL это удобство, но нет фактического типа столбца SERIAL.