1

应用此 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?由于'alter sequence software_seq start with 1000 ;'

4

2 回答 2

5

你这里有一些问题。

首先,仅创建具有特定名称的序列不会将其附加到您要使用它的表和列。您需要更改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和不是真正的类型,serialbigserial只是用于创建唯一标识符列的符号方便(类似于某些其他数据库支持的 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 sequenceor setval

于 2012-12-09T01:48:03.353 回答
0

大概我得到了。如果一个人想改变顺序,那么他应该使用这个语法:

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

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

我测试过:然后在插入新值时它真的从 1000 开始。

于 2012-12-09T01:46:34.097 回答