Postgresql 序列与串行
Postgresql Sequence vs Serial
我在想什么时候选择序列比较好,什么时候比较好
使用串行。
我想要的是在使用
插入后返回最后一个值
SELECT LASTVAL();
我读了这个问题
PostgreSQL Autoincrement
我以前没用过serial
查看有关 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 是一种伪数据类型。它将创建一个序列对象。让我们看一下直接的 table(类似于您将在 link 中看到的那个)。
create table test(field1 serial);
这将导致与 table 一起创建一个序列。序列名称的命名法是 <tablename>_<fieldname>_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
您可以重复使用由串行数据类型自动创建的序列,或者您可以选择每个 table.
只使用一个 serial/sequence
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 的序列,我们会得到一个错误)
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
2021 年答案使用 identity
I was wondering when it is better to choose sequence, and when it is better to use serial.
不是整个问题的答案(只有上面引用的部分),但我想它仍然可以帮助更多的读者。你不应该使用 sequence 或 serial,你应该更喜欢 identity
columns:
create table apps (
id integer primary key generated always as identity
);
查看详细答案: (and also https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_serial)
我在想什么时候选择序列比较好,什么时候比较好 使用串行。
我想要的是在使用
插入后返回最后一个值SELECT LASTVAL();
我读了这个问题 PostgreSQL Autoincrement
我以前没用过serial
查看有关 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 是一种伪数据类型。它将创建一个序列对象。让我们看一下直接的 table(类似于您将在 link 中看到的那个)。
create table test(field1 serial);
这将导致与 table 一起创建一个序列。序列名称的命名法是 <tablename>_<fieldname>_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
您可以重复使用由串行数据类型自动创建的序列,或者您可以选择每个 table.
只使用一个 serial/sequencecreate table table3(id serial, firstname varchar(20));
create table table4(id int not null default nextval('table3_id_seq'), firstname varchar(20));
(这里的风险是,如果 table3 被丢弃,我们继续使用 table3 的序列,我们会得到一个错误)
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
2021 年答案使用 identity
I was wondering when it is better to choose sequence, and when it is better to use serial.
不是整个问题的答案(只有上面引用的部分),但我想它仍然可以帮助更多的读者。你不应该使用 sequence 或 serial,你应该更喜欢 identity
columns:
create table apps (
id integer primary key generated always as identity
);
查看详细答案: