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