应用此sql脚本:
create table software (
id bigint not null,
name varchar(255),
description varchar(255),
constraint pk_software primary key (id))
;
create sequence software_seq;
然后这个:
alter sequence software_seq start with 1000;;
insert into software (id, name, description) values ( 1, 'Soft1', 'Description1');
然后以编程方式插入新软件(来自java),获得 id = 24
的新软件为什么不用1001?因为'更改序列 software_seq以1000开头;'
答案 0 :(得分:5)
这里有一些问题。
首先,仅创建具有特定名称的序列不会将其附加到您想要使用它的表和列。您需要更改software.id
以使用software_seq
作为默认值:
alter table software alter column id set default nextval('software_seq');
并且您也想要更改sequence's ownership(除非您在其他地方使用该序列):
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 ('...', '...');
或指定DEFAULT:
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
或setval
设置起始值。
答案 1 :(得分:0)
可能我得到了。如果想要改变序列,那么他应该使用这种语法:
ALTER SEQUENCE sequenceName [RESTART WITH long] [INCREMENT BY long]
即。使用'RESTART'而不是'START'
我测试过:当插入新值时,它真的以1000开头。