PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Nie rozumiem, jak działa nextval() postgresql, czy ktoś mógłby to wyjaśnić?

NEXTVAL to funkcja pobierająca następną wartość z sekwencji.

Sekwencja to obiekt, który zwraca coraz większe liczby, różne dla każdego połączenia, niezależnie od transakcji itp.

Za każdym razem, gdy dzwonisz do NEXTVAL , otrzymasz inny numer.

Jest to używane głównie do generowania zastępczych kluczy podstawowych dla tabel.

Możesz utworzyć taką tabelę:

CREATE SEQUENCE mysequence;
CREATE TABLE mytable (id BIGINT NOT NULL PRIMARY KEY, value INT);

i wstawiaj wartości w ten sposób:

INSERT
INTO    mytable (id, value)
VALUES
        (NEXTVAL('mysequence'), 1),
        (NEXTVAL('mysequence'), 2);

i zobacz, co otrzymasz:

SELECT * FROM mytable;
 id | value
----+-------
  1 |     1
  2 |     2

PostgreSQL oferuje w tym celu niezłą składnię:

CREATE TABLE mytable (id BIGSERIAL PRIMARY KEY, value INT);

co jest równoznaczne z

CREATE SEQUENCE mytable_id_seq; -- table_column_'seq'
CREATE TABLE mytable (id BIGINT NOT NULL PRIMARY KEY DEFAULT NEXTVAL('mytable_id_seq'), value INT); -- it's not null and has a default value automatically

i może być używany w następujący sposób:

INSERT
INTO    mytable (value)
VALUES  (1),
        (2);  -- you can omit id, it will get filled for you.

Zauważ, że nawet jeśli wycofasz swoją instrukcję INSERT lub uruchomisz jednoczesne instrukcje z dwóch różnych sesji, zwrócone wartości sekwencji nigdy nie będą takie same i nigdy nie zostaną ponownie użyte (przeczytaj drobny druk w dokumentacji, chociaż w sekcji CYCLE ).

Dzięki temu możesz mieć pewność, że wszystkie wartości Twoich kluczy podstawowych zostaną wygenerowane unikatowo w tabeli.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie znaleziono polecenia testing.postgresql:initdb w dockerze

  2. Różnica między RDBMS a ORDBMS

  3. Korzystanie z dynamicznego zapytania + typ danych zdefiniowany przez użytkownika w Postgres

  4. libpq:Jak uzyskać kod błędu po nieudanym połączeniu PGconn?

  5. Nie aktualizuj kolumny, jeśli wartość aktualizacji ma wartość null