web-dev-qa-db-fra.com

Séquence Postgresql vs série

Je me demandais quand il valait mieux choisir la séquence, et quand il valait mieux utiliser la série.

Ce que je veux, c'est retourner la dernière valeur après l'insertion en utilisant

SELECT LASTVAL();

J'ai lu cette question PostgreSQL Autoincrement

Je n'utilise jamais de série auparavant.

21
Se Song

Découvrez une belle réponse à propos de séquence vs série

La séquence créera simplement une séquence de nombres uniques. Ce n'est pas un type de données. C'est une séquence. Par exemple:

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

Vous pouvez utiliser la même séquence à plusieurs endroits comme celui-ci:

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 |

La série est un pseudo-type de données. Il créera un objet séquence. Jetons un coup d'œil à un tableau simple (similaire à celui que vous verrez dans le lien).

create table test(field1 serial);

Cela entraînera la création d'une séquence avec la table. La nomenclature du nom de séquence est __seq. Celui ci-dessus est équivalent à:

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

Voir également: http://www.postgresql.org/docs/9.3/static/datatype-numeric.html

Vous pouvez réutiliser la séquence qui est créée automatiquement par type de données série, ou vous pouvez choisir d'utiliser simplement une série/séquence par table.

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

(Le risque ici est que si table3 est supprimée et que nous continuons à utiliser la séquence de table3, nous obtiendrons une erreur)

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 |    

N'hésitez pas à essayer un exemple: http://sqlfiddle.com/#!15/074ac/1

32
zedfoxus