为什么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
当您使用语法创建一个表:
CREATE TABLE xxx OF yyyy
您可以添加默认值和约束,但不改变或指定列的类型。
SERIAL类型实际上是数据类型,NOT NULL约束和默认值规范的组合。它等效于:
integer NOT NULL DEFAULT nextval('tablename_colname_seq')
所以,相反,你将不得不使用:
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
为好,如上图所示。
没有明白。在文档中,它说:“数据类型smallserial,serial和bigserial不是真正的类型,而仅仅是创建唯一标识符列的符号方便程度。”所以'串行'它只是我应该用于我的序列(我必须创建)的单词? – tomyforever
@ user3502170:如果您使用具有“正常”表格定义的“serial”,则序列将自动在后台创建。但是,当你使用类型过于复杂的设置时,你需要自己做。 –
为什么你首先使用'TYPE'?你试图解决的实际问题是什么?为什么不使用'create table families(id serial primary key,name varchar(35),img_address varchar(150));'? –
因为我正在使用Java,我想在数据库中创建对象。 – tomyforever
这与您在数据库中创建表的方式完全无关。除此之外,如果你只运行'create table family(...)',你自动也会有一个名为'family'的类型。 –