将序列附加到列并以1000开头

时间:2012-12-09 01:32:30

标签: sql postgresql sequence

应用此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开头;'

2 个答案:

答案 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

  

数据类型smallserialserialbigserial不是真正的类型,而只是创建唯一标识符列的符号方便(类似于某些其他数据库支持的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 sequencesetval设置起始值。

答案 1 :(得分:0)

可能我得到了。如果想要改变序列,那么他应该使用这种语法:

ALTER SEQUENCE sequenceName [RESTART WITH long] [INCREMENT BY long]

即。使用'RESTART'而不是'START'

我测试过:当插入新值时,它真的以1000开头。