tl;dr
Specificeer nu in Postgres 10 GENERATED BY DEFAULT AS IDENTITY
volgens de SQL-standaard.
create table tower
(
npages integer,
ifnds integer,
ifnid integer,
name varchar(20),
towid integer GENERATED BY DEFAULT AS IDENTITY -- per SQL standard
)
Identiteitskolom
Postgres 10 ondersteunt nu het concept van identiteitskolom , en gebruikt de standaard SQL-syntaxis. Hoewel ik geen expert ben op het gebied van MS SQL Server, geloof ik dat deze nieuwe standaardondersteuning gelijkwaardig is.
GENERATED … AS IDENTITY
De GENERATED … AS IDENTITY
commando gebruikt tijdens CREATE TABLE
creëert een impliciete reeks. Het aanmaken, benoemen, permissies en laten vallen van die reeks is transparant voor jou, in tegenstelling tot SERIAL
. Heel intuïtief nu. Als u een gebruiksmachtiging aan de tabel verleent, krijgen zij toestemming voor de reeks. Als u de tabel laat vallen, wordt de reeks automatisch verwijderd.
Twee smaken van de standaard syntaxis. Het verschil is alleen van belang als u een waarde doorgeeft in plaats van een waarde te laten genereren. Doorgaans vertrouwen mensen altijd op de gegenereerde waarde, dus normaal gesproken zou je gewoon de eerste versie gebruiken, GENERATED BY DEFAULT AS IDENTITY
.
GENERATED BY DEFAULT AS IDENTITY
- Genereert een waarde tenzij de
INSERT
commando geeft een waarde.
- Genereert een waarde tenzij de
GENERATED ALWAYS AS IDENTITY
- Negeert elke waarde geleverd door
INSERT
tenzijOVERRIDING SYSTEM VALUE
. wordt opgegeven
- Negeert elke waarde geleverd door
Zie de CREATE TABLE
pagina voor documentatie.
Lees deze interessante pagina
door Peter Eisentraut. Hij legt enkele rare problemen uit met SERIAL
. Geen dergelijke problemen met de nieuwe identiteitskolomfunctie. Er is dus geen reden om SERIAL
te gebruiken meer, geen nadelen, alleen voordelen; SERIAL
wordt vervangen door GENERATED … AS IDENTITY
.
Houd er rekening mee dat een identiteitskolom niet noodzakelijkerwijs een primaire sleutel is en niet automatisch wordt geïndexeerd. U moet dus nog steeds PRIMARY KEY
opgeven expliciet als dat uw bedoeling is (zoals gewoonlijk het geval zou zijn).
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 )
) ;
Het is de bedoeling dat de interne uitvoeringsdetails voor u verborgen blijven. U hoeft de naam niet te kennen van de reeks die onder de dekens wordt gegenereerd. U kunt bijvoorbeeld de teller via de kolom resetten zonder de onderliggende volgorde te kennen.
ALTER TABLE person_
ALTER COLUMN id_
RESTART WITH 1000 -- Reset sequence implicitly, without a name.
;
Identiteit impliciet specificeren:
- Markeert kolom
NOT NULL
- Maakt een reeks
- Type reeks komt overeen met de kolom ( 32-bits 64-bits enz.)
- Verbindt de reeks met de kolom
- Erft rechten
- Cascades vallen weg
- Blijft aan de kolom gekoppeld, zelfs als de kolom wordt hernoemd
- Specificeert de reeks als bron van standaardwaarden voor die kolom
De identiteitskolom kan dezelfde opties hebben als CREATE SEQUENCE
:
START WITH start
MINVALUE minvalue
|NO MINVALUE
MAXVALUE maxvalue
|NO MAXVALUE
INCREMENT [ BY ] increment
CYCLE
|NO CYCLE
CACHE
cacheOWNED BY NONE
( het specificeren van eigendom voor identiteitskolom heeft geen zin voor mij aangezien eigendom automatisch wordt beheerd )
Dom voorbeeld van opties:
id_ INTEGER
GENERATED BY DEFAULT AS IDENTITY (
START WITH 200
MINVALUE 100
MAXVALUE 205
CYCLE
INCREMENT BY 3
) PRIMARY KEY
4 rijen toevoegen: