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开头 ;'
你这里有一些错误.
首先,仅创建具有特定名称的序列不会将其附加到您想要使用它的表和列.您需要更改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 WITHstart会更改记录的序列起始值.这对当前序列值没有影响; 它只是设置未来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属性)一个符号上的便利.在当前实现中,指定:Run Code Online (Sandbox Code Playgroud)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;
因此,使用bigserial的id列类型将设置所有序列的东西给你.然后你将使用alter sequence或之前设置起始值setval.
| 归档时间: |
|
| 查看次数: |
3231 次 |
| 最近记录: |