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
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 –
"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. –
dziękuję za pomoc –