PostgreSQL 功能强大,您刚刚被一项高级功能所吸引。
您的 DDL 非常有效,但根本不是您认为的那样。
序列可以被认为是一个额外事务的简单表,用于为某些列生成下一个值。
你打算做什么
根据另一个答案,您打算这样定义 id 字段:
id integer PRIMARY KEY default nextval('ownseq'),
你做了什么
您所做的实际上是为您的表定义一个嵌套数据结构。假设我创建了一个测试序列:
CREATE SEQUENCE testseq;
然后假设我\d testseq
在 Pg 9.1 上,我得到:
Sequence "public.testseq"
Column | Type | Value
---------------+---------+---------------------
sequence_name | name | testseq
last_value | bigint | 1
start_value | bigint | 1
increment_by | bigint | 1
max_value | bigint | 9223372036854775807
min_value | bigint | 1
cache_value | bigint | 1
log_cnt | bigint | 0
is_cycled | boolean | f
is_called | boolean | f
这是序列使用的类型的定义。
现在假设我:
create table seqtest (test testseq, id serial);
我可以插入其中:
INSERT INTO seqtest (id, test) values (default, '("testseq",3,4,1,133445,1,1,0,f,f)');
然后我可以从中选择:
select * from seqtest;
test | id
----------------------------------+----
(testseq,3,4,1,133445,1,1,0,f,f) | 2
此外,我可以扩展测试:
SELECT (test).* from seqtest;
select (test).* from seqtest;
sequence_name | last_value | start_value | increment_by | max_value | min_value
| cache_value | log_cnt | is_cycled | is_called
---------------+------------+-------------+--------------+-----------+----------
-+-------------+---------+-----------+-----------
| | | | |
| | | |
testseq | 3 | 4 | 1 | 133445 | 1
| 1 | 0 | f | f
(2 rows)
这种事情在 PostgreSQL 中实际上非常强大,但充满了意想不到的角落(例如,not null 和检查约束在嵌套数据类型中无法按预期工作)。我一般不推荐嵌套数据类型,但值得知道 PostgreSQL 可以做到这一点,并且很乐意接受 SQL 命令来做到这一点而不会发出警告。