Pytanie Sekwencja PostgreSQL a Serial


Zastanawiałem się, kiedy lepiej wybrać sekwencję, a kiedy jest lepiej używać seryjnego.

To, czego chcę, to zwrócenie ostatniej wartości po wstawieniu za pomocą

SELECT LASTVAL();

Czytam to pytanie Autoinkrement PostgreSQL

Nigdy nie używam seryjnego.


14
2017-12-02 04:01


pochodzenie


Jeśli chcesz, aby jego szereg lub sekwencja była przypisana do tego, co właśnie wstawiłeś, lepiej użyć RETURNING komunikat. Widzieć stackoverflow.com/questions/19167349/... - Alexandre TryHard Leblanc
ZA serial używa sekwencji w tle. Zasadniczo nie ma różnicy. Za pomocą lastval() zaraz po wstawieniu jest w porządku w obu przypadkach. - a_horse_with_no_name
dziękuje Ci za pomoc - Se Song


Odpowiedzi:


Sprawdź miłą odpowiedź na temat Sekwencja kontra Serial

Sekwencja stworzy sekwencję unikalnych liczb. To nie jest typ danych. To jest sekwencja. Na przykład:

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

Możesz użyć tej samej sekwencji w wielu miejscach takich jak to:

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 |

Szeregowy to pseudo typ danych. 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 jest równoważny:

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żesz ponownie użyć sekwencji, która jest automatycznie tworzona przez typ danych szeregowych, lub możesz wybrać użycie jednego numeru seryjnego / sekwencji na tabelę.

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

(Ryzykiem jest to, że jeśli tabela 3 zostanie usunięta i będziemy kontynuować używanie sekwencji table3, otrzymamy błąd)

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 |    

Możesz wypróbować przykład: http://sqlfiddle.com/#!15/074ac/1


23
2017-12-02 04:23



Tak ale serial nie jest faktycznym typem danych, jest to typ danych pseudo - co jest ważnym rozróżnieniem: stackoverflow.com/a/27309311/939860 lub stackoverflow.com/a/14651788/939860 I ma sens podzielenie się sekwencją w sytuacjach szczególnych, a w takim przypadku używałbyś wolnostojącej sekwencji, a nie takiej, która jest OWNED przez kolumnę szeregową - unikając w ten sposób zastrzeżeń, o których wspominasz na dole odpowiedzi. - Erwin Brandstetter