为什么SERIAL在Postgres的这张简单的桌子上不工作?

问题描述:

我正在使用Postgres 9.1。和auto_increment(串行)不起作用。我刚刚发现了这个关于“串行”: https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL为什么SERIAL在Postgres的这张简单的桌子上不工作?

CREATE TYPE FAMILY AS(
    id int, 
    name VARCHAR(35), 
    img_address VARCHAR(150)); 

CREATE TABLE FAMILIES of FAMILY(
    id SERIAL primary key NOT NULL, 
    name NOT NULL 
    ); 

ERROR: syntax error at or near "SERIAL" 
LINE 7: id SERIAL primary key NOT NULL, 
         ^


********** Error ********** 

ERROR: syntax error at or near "SERIAL" 
SQL state: 42601 
+1

为什么你首先使用'TYPE'?你试图解决的实际问题是什么?为什么不使用'create table families(id serial primary key,name varchar(35),img_address varchar(150));'? –

+0

因为我正在使用Java,我想在数据库中创建对象。 – tomyforever

+1

这与您在数据库中创建表的方式完全无关。除此之外,如果你只运行'create table family(...)',你自动也会有一个名为'family'的类型。 –

当您使用语法创建一个表:

CREATE TABLE xxx OF yyyy 

您可以添加默认值和约束,但不改变或指定列的类型。

SERIAL类型实际上是数据类型,NOT NULL约束和默认值规范的组合。它等效于:

integer NOT NULL DEFAULT nextval('tablename_colname_seq') 

参见:documentation for SERIAL

所以,相反,你将不得不使用:

CREATE SEQUENCE families_id_seq; 

CREATE TABLE FAMILIES of FAMILY(
    id WITH OPTIONS NOT NULL DEFAULT nextval('families_id_seq'), 
    name WITH OPTIONS NOT NULL 
); 

ALTER SEQUENCE families_id_seq OWNED BY FAMILIES.id; 

你将不得不手动创建序列families_id_seq为好,如上图所示。

+0

没有明白。在文档中,它说:“数据类型smallserial,serial和bigserial不是真正的类型,而仅仅是创建唯一标识符列的符号方便程度。”所以'串行'它只是我应该用于我的序列(我必须创建)的单词? – tomyforever

+0

@ user3502170:如果您使用具有“正常”表格定义的“serial”,则序列将自动在后台创建。但是,当你使用类型过于复杂的设置时,你需要自己做。 –