当我创建带有序列类型的测试表时, 序列号实际上是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
答案 0 :(得分:1)
SERIAL
并不是一种类型;如9.5 docs中所述,它只是一系列命令的简写:
数据类型
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
类型仅适用于表列,而序列定义中未提及。 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