2015-12-02 3 views
9

Zastanawiam się, kiedy lepiej jest wybrać sekwencję, a kiedy jest lepiej używać seryjnego.Sekwencja PostgreSQL po Serial

Co chcę zwraca ostatnią wartość po insertu z użyciem

SELECT LASTVAL(); 

czytam to pytanie PostgreSQL Autoincrement

nigdy przed użyciem szeregowego.

+0

Jeśli chcesz jej seryjny lub sekwencja przypisana do tego, co właśnie włożona, to lepiej użyć '' 'oświadczenie RETURNING'''. Zobacz http://stackoverflow.com/questions/19167349/postgresql-insert-from-select-returning-id –

+0

"Serial" używa sekwencji w tle. Zasadniczo nie ma różnicy. Użycie 'lastval()' zaraz po wstawieniu jest w porządku tylko w obu przypadkach. –

+0

dziękuję za pomoc –

Odpowiedz

18

Wyjazd miłą odpowiedź o Sequence vs. Serial

Sekwencja będzie po prostu stworzyć sekwencję unikalnych numerów. To nie jest typ danych. To jest sekwencja. Na przykład:

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

można wykorzystywać tę samą sekwencję w wielu miejscach tak:

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 | 

seryjny jest typ danych pseudo. Tworzy obiekt sekwencji. Rzućmy okiem na prosty stół (podobny do tego, który zobaczysz w łączu).

create table test(field1 serial); 

Spowoduje to utworzenie sekwencji razem z tabelą. Nazewnictwo nazw sekwencji to __seq. Powyższy jeden jest równoznaczne z:

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

zobacz także: http://www.postgresql.org/docs/9.3/static/datatype-numeric.html

można ponownie wykorzystać sekwencję, która jest automatycznie tworzony przez szeregowego typu danych, można też wybrać opcję, aby po prostu użyć jednego seryjnego/sekwencję za stołem.

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

(Ryzyko jest to, że jeśli table3 jest odrzucany, a my nadal korzystać sekwencję table3 za, będziemy się błąd) tworzyć tab.5 tabeli (id serial, varchar firstname (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 |  

Zapraszam do wypróbowania przykład: http://sqlfiddle.com/#!15/074ac/1

+4

Tak, ale 'seryjny' nie jest faktycznym typem danych, jest to typ danych pseudo - który jest ważnym rozróżnieniem: http://stackoverflow.com/a/27309311/939860 lub http://stackoverflow.com/a/14651788/939860 I ma sens podzielenie sekwencji w specjalnych sytuacjach, a w takim przypadku użyjesz wolnostojącej sekwencji, a nie takiej, która jest "OWNED" przez kolumnę szeregową - stąd unikając zastrzeżeń, o których wspominasz na dole odpowiedzi. –