关于sql:Postgresql序列与串口

Postgresql Sequence vs Serial

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

我想要的是在插入后使用返回最后一个值

1
SELECT LASTVAL();

我读了这个问题
PostgreSQL自动增量

我从来没有使用过串口。


查看关于序列与序列的好答案

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

1
2
3
CREATE SEQUENCE testing1;
SELECT NEXTVAL('testing1');  -- 1
SELECT NEXTVAL('testing1');  -- 2

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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是一种伪数据类型。它将创建序列对象。让我们来看一个直截了当的表(类似于你将在链接中看到的表)。

1
CREATE TABLE test(field1 serial);

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

1
2
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

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

1
2
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的序列,我们将收到错误)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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