tl;dr
Nyní v Postgres 10 zadejte GENERATED BY DEFAULT AS IDENTITY
podle standardu SQL.
create table tower
(
npages integer,
ifnds integer,
ifnid integer,
name varchar(20),
towid integer GENERATED BY DEFAULT AS IDENTITY -- per SQL standard
)
Sloupec identity
Postgres 10 nyní podporuje koncept sloupce identity a používá standardní syntaxi SQL. I když nejsem odborník na MS SQL Server, věřím, že tato nová standardní podpora je ekvivalentní.
GENERATED … AS IDENTITY
GENERATED … AS IDENTITY
příkaz použitý během CREATE TABLE
vytváří implicitní sekvenci. Na rozdíl od SERIAL
je pro vás vytvoření, pojmenování, oprávnění a zrušení této sekvence transparentní. . Nyní velmi intuitivní. Pokud tabulce udělíte oprávnění k použití, získají oprávnění pro sekvenci. Pokud tabulku zahodíte, sekvence se automaticky zruší.
Dvě varianty standardní syntaxe. Na rozdílu záleží pouze v případě, že předáte hodnotu, místo abyste nechali hodnotu vygenerovat. Lidé obvykle vždy spoléhají na vygenerovanou hodnotu, takže normálně byste jednoduše použili první verzi, GENERATED BY DEFAULT AS IDENTITY
.
GENERATED BY DEFAULT AS IDENTITY
- Vygeneruje hodnotu, pokud není
INSERT
příkaz poskytuje hodnotu.
- Vygeneruje hodnotu, pokud není
GENERATED ALWAYS AS IDENTITY
- Ignoruje jakoukoli hodnotu poskytnutou příkazem
INSERT
pokud neurčíteOVERRIDING SYSTEM VALUE
- Ignoruje jakoukoli hodnotu poskytnutou příkazem
Viz CREATE TABLE
stránku pro dokumentaci.
Přečtěte si tuto zajímavou stránku
od Petera Eisentrauta. Vysvětluje některé podivné problémy s SERIAL
. Žádné takové problémy s novou funkcí sloupce identity. Není tedy důvod používat SERIAL
už žádné stinné stránky, jen klady; SERIAL
je nahrazeno GENERATED … AS IDENTITY
.
Všimněte si, že sloupec identity není nutně primární klíč a není automaticky indexován. Stále tedy musíte zadat PRIMARY KEY
výslovně, pokud je to vaším záměrem (jak by tomu bylo obvykle).
CREATE TABLE person_ (
id_
INTEGER
GENERATED BY DEFAULT AS IDENTITY -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT.
PRIMARY KEY -- Creates index. Specifies UNIQUE. Marks column for relationships.
,
name_
VARCHAR( 80 )
) ;
Záměrem je, aby vám byly detaily interní implementace skryty. Není nutné, abyste znali název sekvence, která se generuje pod krytem. Můžete například resetovat počítadlo pomocí sloupce, aniž byste znali základní sekvenci.
ALTER TABLE person_
ALTER COLUMN id_
RESTART WITH 1000 -- Reset sequence implicitly, without a name.
;
Implicitní určení identity:
- Sloupec označí
NOT NULL
- Vytvoří sekvenci
- Typ sekvence odpovídá sloupci (32bitová, 64bitová atd.)
- Spojí sekvenci se sloupcem
- Zdědí oprávnění
- Kaskády klesají
- Zůstává svázán se sloupcem, i když byl sloupec přejmenován
- Určuje sekvenci jako zdroj výchozích hodnot pro daný sloupec
Sloupec identity může mít stejné možnosti jako CREATE SEQUENCE
:
START WITH start
MINVALUE minvalue
|NO MINVALUE
MAXVALUE maxvalue
|NO MAXVALUE
INCREMENT [ BY ] increment
CYCLE
|NO CYCLE
CACHE
mezipaměťOWNED BY NONE
(zadání vlastnictví pro sloupec identity mi nedává smysl, protože vlastnictví je spravováno automaticky)
Hloupý příklad možností:
id_ INTEGER
GENERATED BY DEFAULT AS IDENTITY (
START WITH 200
MINVALUE 100
MAXVALUE 205
CYCLE
INCREMENT BY 3
) PRIMARY KEY
Přidání 4 řádků: