Postgresql序列与串行

时间:2015-12-02 04:01:28

标签: sql postgresql

我想知道什么时候选择序列更好,什么时候更好 使用序列号。

我想要的是在使用

插入后返回最后一个值
SELECT LASTVAL();

我读了这个问题 PostgreSQL Autoincrement

我之前从未使用过串口。

2 个答案:

答案 0 :(得分:26)

查看关于Sequence vs. Serial

的好答案

序列只会创建唯一数字序列。它不是数据类型。这是一个序列。例如:

create sequence testing1;
select nextval('testing1');  -- 1
select nextval('testing1');  -- 2

您可以在多个地方使用相同的序列,如下所示:

create sequence testing1;
create table table1(id int not null default nextval('testing1'), firstname varchar(20));
create table table2(id int not null default nextval('testing1'), firstname varchar(20));

insert into table1 (firstname) values ('tom'), ('henry');
insert into table2 (firstname) values ('tom'), ('henry');

select * from table1;

| id | firstname |
|----|-----------|
|  1 |       tom |
|  2 |     henry |

select * from table2;

| id | firstname |
|----|-----------|
|  3 |       tom |
|  4 |     henry |

Serial是一种伪数据类型。它将创建序列对象。让我们来看一个直截了当的表(类似于你在链接中看到的表)。

create table test(field1 serial);

这将导致序列与表一起创建。序列名称的命名是__seq。上述内容相当于:

create sequence test_field1_seq;
create table test(field1 int not null default nextval('test_field1_seq'));

另见:http://www.postgresql.org/docs/9.3/static/datatype-numeric.html

您可以重复使用串行数据类型自动创建的序列,也可以选择每个表只使用一个序列/序列。

create table table3(id serial, firstname varchar(20));
create table table4(id int not null default nextval('table3_id_seq'), firstname varchar(20));

(这里的风险是,如果删除table3并继续使用table3&#39序列,我们将收到错误)

create table table5(id serial, firstname varchar(20));    
insert into table3 (firstname) values ('tom'), ('henry');
insert into table4 (firstname) values ('tom'), ('henry');
insert into table5 (firstname) values ('tom'), ('henry');

select * from table3;
| id | firstname |
|----|-----------|
|  1 |       tom |
|  2 |     henry |

select * from table4; -- this uses sequence created in table3
| id | firstname |
|----|-----------|
|  3 |       tom |
|  4 |     henry |

select * from table5;
| id | firstname |
|----|-----------|
|  1 |       tom |
|  2 |     henry |    

随意尝试一个例子:http://sqlfiddle.com/#!15/074ac/1

答案 1 :(得分:2)

2021 使用 identity

回答 <块引用>

我想知道什么时候选择sequence比较好,什么时候用serial比较好。

不是整个问题的答案(仅上面引用的部分),但我想它仍然可以帮助更多的读者。你不应该使用序列或序列,你应该更喜欢 identity 列:

create table apps (
    id integer primary key generated always as identity
);

请参阅此详细答案:https://stackoverflow.com/a/55300741/978690(还有 https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_serial