Sql 将序列附加到列并从1000开始
应用此sql脚本:Sql 将序列附加到列并从1000开始,sql,postgresql,sequence,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; 那么这个, alte
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软件从1000开始” 可能是我的错。如果要更改序列,则应使用以下语法: ALTER SEQUENCE sequenceName[长时间重新启动][长时间递增] i、 e.使用“重启”而不是“启动”
我测试过:当插入新值时,它实际上是从1000开始的。可能我得到了。如果要更改序列,则应使用以下语法: ALTER SEQUENCE sequenceName[长时间重新启动][长时间递增] i、 e.使用“重启”而不是“启动”
我测试过:插入新值时,它实际上从1000开始。这里有一些错误 首先,仅仅创建具有特定名称的序列并不会将其附加到您想要使用它的表和列。您需要更改
software.id
以使用software\u seq
作为默认值:
alter table software alter column id set default nextval('software_seq');
您还需要更改序列(当然,除非您在其他地方使用序列):
属于表名。列名
无所有
拥有的选项使序列与特定的表列相关联,这样,如果该列(或其整个表)被删除,序列也将被自动删除。如果指定,此关联将替换先前为序列指定的任何关联。指定的表必须具有相同的所有者,并且与序列处于相同的架构中。指定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 WITH
START更改序列的记录开始值。这对电流序列值没有影响;它只是设置未来ALTER SEQUENCE RESTART
命令将使用的值
如果希望序列从1000开始,则可以:
alter sequence software_seq restart with 1000;
或者,您可以使用:
当然,您也可以使用:
数据类型smallserial
、serial
和bigserial
不是真正的类型,只是创建唯一标识符列的一种符号方便(类似于某些其他数据库支持的自动增量属性)。在当前实现中,指定:
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;
等同于指定:
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
设置起始值。您这里有一些错误
首先,仅仅创建具有特定名称的序列并不会将其附加到您想要使用它的表和列。您需要更改software.id
以使用software\u seq
作为默认值:
alter table software alter column id set default nextval('software_seq');
您还需要更改序列(当然,除非您在其他地方使用序列):
属于表名。列名
无所有
拥有的选项使序列与特定的表列相关联,这样,如果该列(或其整个表)被删除,序列也将被自动删除。如果指定,此关联将替换先前为序列指定的任何关联。指定的表必须具有相同的所有者,并且与序列处于相同的架构中。指定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 WITH
START更改序列的记录开始值。这对电流序列值没有影响;它只是设置未来ALTER SEQUENCE RESTART
命令将使用的值
如果希望序列从1000开始,则可以:
alter sequence software_seq restart with 1000;
或者,您可以使用:
当然,您也可以使用:
数据类型smallserial
、serial
和bigserial
不是真正的类型,只是创建唯一标识符列的一种符号方便(类似于某些其他数据库支持的自动增量属性)。在当前实现中,指定:
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;
等同于指定:
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
关于附加设置起始值:我认为默认情况下,它是按名称附加的,因为它在定义此序列后适用于该表。我需要预定义一些ID,因为我在测试中使用了一些数据(行)。。id.@ses:你的Java程序是在背后做事情吗?例如将序列附加到software.id
默认值?我不熟悉Java方面的东西,但必须有人将序列附加到表中,PostgreSQL不会自动执行,除非您使用一种串行列类型。如果不想使用序列,只需在INSERT中手动指定id
,只需w