Создание сериала фактически создает большой сериал - PullRequest
2 голосов
/ 01 июня 2019

Когда я создаю тестовую таблицу с серийным типом, Сериал на самом деле является типом bigserial. Это вызывает какие-либо проблемы? Это ошибка? PostgreSQL 9.5.3 Red Hat 64-bit

#> CREATE TABLE test (id SERIAL PRIMARY KEY, name text);
#> \d+ test
    Table "public.test"
 Column |  Type   |                     Modifiers                     | Storage  | Stats target | Description 
--------+---------+---------------------------------------------------+----------+--------------+-------------
 id     | integer | not null default nextval('test_id_seq'::regclass) | plain    |              | 
 name   | text    |                                                   | extended |              | 
Indexes:
"test_pkey" PRIMARY KEY, btree (id)

#> \d+ test_id_seq
    Sequence "public.test_id_seq"
    Column     |  Type   |        Value        | Storage 
---------------+---------+---------------------+---------
 sequence_name | name    | test_id_seq         | plain
 last_value    | bigint  | 1                   | plain
 start_value   | bigint  | 1                   | plain
 increment_by  | bigint  | 1                   | plain
 max_value     | bigint  | 9223372036854775807 | plain
 min_value     | bigint  | 1                   | plain
 cache_value   | bigint  | 1                   | plain
 log_cnt       | bigint  | 0                   | plain
 is_cycled     | boolean | f                   | plain
 is_called     | boolean | f                   | plain

1 Ответ

1 голос
/ 01 июня 2019

SERIAL на самом деле не тип; как объясняется в 9.5 документах , это просто сокращение для набора команд:

Типы данных smallserial, serial и bigserial не являются истинными типами, а просто удобством нотации [...] В текущей реализации указывается:

CREATE TABLE tablename (
    colname SERIAL
);

эквивалентно указанию:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

Как видите, тип integer применяется только к столбцу таблицы и не упоминается в определении последовательности. Оператор CREATE SEQUENCE в 9.5 не позволяет вам указывать тип; все последовательности основаны на счетчиках bigint, следовательно, столбцы bigint в вашем выводе \d+.

Это больше не относится к Postgres 10: теперь вы можете присоединить тип данных к последовательности, и согласно новым документам , последовательность в примере SERIAL выше теперь определяется как:

CREATE SEQUENCE tablename_colname_seq AS integer;

Это действительно только для ограничения максимального значения последовательности - внутренний счетчик по-прежнему равен bigint - но он сообщается как соответствующий тип \d+ (который теперь выглядит совсем иначе):

test=# \d+ tablename_colname_seq
               Sequence "public.tablename_colname_seq"
  Type   | Start | Minimum |  Maximum   | Increment | Cycles? | Cache
---------+-------+---------+------------+-----------+---------+-------
 integer |     1 |       1 | 2147483647 |         1 | no      |     1
...