创建序列实际上会创建一个bigserial

时间:2019-05-31 21:32:47

标签: postgresql int bigint

当我创建带有序列类型的测试表时, 序列号实际上是bigserial类型。 这会引起任何问题吗? 这是错误吗? PostgreSQL 9.5.3 红帽64位

#> 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 个答案:

答案 0 :(得分:1)

SERIAL并不是一种类型;如9.5 docs中所述,它只是一系列命令的简写:

  

数据类型smallserialserialbigserial不是真实类型,而只是符号上的方便[...]在当前实现中,指定:

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类型仅适用于表列,而序列定义中未提及。 9.5中的CREATE SEQUENCE语句不允许您指定类型。所有序列都基于bigint计数器,因此在bigint输出中的\d+列中。

从Postgres 10开始,情况不再如此:您现在可以将数据类型附加到序列上,并且根据new docs,现在已经定义了以上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