你这里有一些问题。
首先,仅创建具有特定名称的序列不会将其附加到您要使用它的表和列。您需要更改software.id
为使用software_seq
默认值:
alter table software alter column id set default nextval('software_seq');
并且您还需要更改序列的所有权(当然,除非您在其他地方使用该序列):
OWNED BY table_name.column_name
OWNED BY NONE
该OWNED BY
选项使序列与特定的表列相关联,这样如果删除该列(或其整个表),该序列也将自动删除。如果指定,此关联将替换之前为该序列指定的任何关联。指定的表必须与序列具有相同的所有者并且在相同的模式中。指定OWNED BY NONE
删除任何现有的关联,使序列“独立”。
所以你应该:
alter sequence software_seq owned by software.id;
然后在插入时,您可以省略id
:
insert into software (name, description) values ('...', '...');
或指定默认值:
insert into software (id, name, description) values (default, '...', '...');
你的另一个问题是它start with
没有做你认为它做的事情:
start
可选子句START WITH
start更改序列的记录开始值。这对当前序列值没有影响;它只是设置未来ALTER SEQUENCE RESTART
命令将使用的值。
如果您希望序列从 1000 开始,那么您可以:
alter sequence software_seq restart with 1000;
或者,您可以使用setval
:
select setval('software_seq', 1000);
当然,你也可以使用bigserial
:
数据类型smallserial
和不是真正的类型,serial
而bigserial
只是用于创建唯一标识符列的符号方便(类似于某些其他数据库支持的 AUTO_INCREMENT 属性)。在当前实现中,指定:
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;
因此,使用bigserial
作为id
列类型将为您设置所有序列内容。然后你会像使用之前一样设置起始值alter sequence
or setval
。