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

ses*_*ses 1 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;
Run Code Online (Sandbox Code Playgroud)

然后这个:

alter sequence software_seq start with 1000;;

insert into software (id, name, description) values (  1, 'Soft1', 'Description1');
Run Code Online (Sandbox Code Playgroud)

然后以编程方式(从java)插入新软件时,获得id = 24的新软件

为什么不用1001?由于'alter sequence software_seq以1000开头 ;'

mu *_*ort 5

你这里有一些错误.

首先,仅创建具有特定名称的序列不会将其附加到您想要使用它的表和列.您需要更改software.id为使用software_seq默认值:

alter table software alter column id set default nextval('software_seq');
Run Code Online (Sandbox Code Playgroud)

你也想改变序列的所有权(除非你在其他地方使用序列):

OWNED BY table_name.column_name
OWNED BY NONE

OWNED BY选项使序列与特定的表列相关联,这样如果删除该列(或其整个表),序列也将自动删除.如果指定,则此关联将替换先前为序列指定的任何关联.指定的表必须具有相同的所有者,并且与序列位于相同的模式中.指定OWNED BY NONE删除任何现有关联,使序列"独立".

所以你应该:

alter sequence software_seq owned by software.id;
Run Code Online (Sandbox Code Playgroud)

然后在插入时,你要么省略id:

insert into software (name, description) values ('...', '...');
Run Code Online (Sandbox Code Playgroud)

或指定DEFAULT:

insert into software (id, name, description) values (default, '...', '...');
Run Code Online (Sandbox Code Playgroud)

你的另一个问题是start with不能做你认为它做的事情:

start

可选子句START WITH start会更改记录的序列起始值.这对当前序列值没有影响; 它只是设置未来ALTER SEQUENCE RESTART命令将使用的值.

如果您希望序列从1000开始,那么您可以:

alter sequence software_seq restart with 1000;
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用setval:

select setval('software_seq', 1000);
Run Code Online (Sandbox Code Playgroud)

当然,你也可以使用bigserial:

的数据类型smallserial,serial并且bigserial不是真正的类型,而仅仅是用于创建的唯一标识符列(类似于通过一些其它数据库中支持的AUTO_INCREMENT属性)一个符号上的便利.在当前实现中,指定:

CREATE TABLE tablename (
    colname SERIAL
);
Run Code Online (Sandbox Code Playgroud)

相当于指定:

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;
Run Code Online (Sandbox Code Playgroud)

因此,使用bigserialid列类型将设置所有序列的东西给你.然后你将使用alter sequence或之前设置起始值setval.