sql >> Databáze >  >> RDS >> PostgreSQL

Nechápu, jak funguje nextval() postgresql, může to někdo vysvětlit?

NEXTVAL je funkce pro získání další hodnoty ze sekvence.

Sequence je objekt, který vrací stále rostoucí čísla, různá pro každý hovor, bez ohledu na transakce atd.

Pokaždé, když zavoláte NEXTVAL , získáte jiné číslo.

To se používá hlavně ke generování náhradních primárních klíčů pro vaše tabulky.

Můžete vytvořit tabulku takto:

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

a vložte hodnoty takto:

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

a uvidíte, co získáte:

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

PostgreSQL pro to nabízí pěkný syntaktický cukr:

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

což je ekvivalentní

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

a lze jej použít takto:

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

Všimněte si, že i když vrátíte zpět svůj příkaz insert nebo spustíte souběžné příkazy ze dvou různých relací, vrácené sekvenční hodnoty nebudou nikdy stejné a nikdy nebudou znovu použity (přečtěte si drobné písmo v dokumentech, i když pod CYCLE ).

Můžete si tedy být jisti, že všechny hodnoty vašich primárních klíčů budou v tabulce generovány jedinečné.




  1. Jak spustit soubor .sql jako součást dotazu MySQL Workbench 6.2?

  2. Yii2:nelze aktualizovat hodnotu sloupce o + 1

  3. Plán provádění dotazů MySQl

  4. Jaký je nejlepší způsob, jak zkontrolovat, zda něco existuje s PDO