tl;dr
Teraz w Postgres 10 określ GENEROWANE DOMYŚLNIE JAKO TOŻSAMOŚĆ
zgodnie ze standardem SQL.
create table tower
(
npages integer,
ifnds integer,
ifnid integer,
name varchar(20),
towid integer GENERATED BY DEFAULT AS IDENTITY -- per SQL standard
)
Kolumna tożsamości
Postgres 10 obsługuje teraz koncepcję kolumny tożsamości i używa standardowej składni SQL. Chociaż nie jestem ekspertem od MS SQL Server, uważam, że ta nowa standardowa obsługa jest równoważna.
GENEROWANO… JAKO TOŻSAMOŚĆ
GENEROWANO… JAKO TOŻSAMOŚĆ
polecenie używane podczas CREATE TABLE
tworzy niejawną sekwencję. Tworzenie, nazywanie, uprawnienia i usuwanie tej sekwencji jest dla Ciebie niewidoczne, w przeciwieństwie do SERIAL
. Teraz bardzo intuicyjne. Jeśli przyznasz uprawnienie do używania tabeli, otrzymają oni pozwolenie na sekwencję. Jeśli usuniesz tabelę, sekwencja zostanie automatycznie usunięta.
Dwie odmiany standardowej składni. Różnica ma znaczenie tylko wtedy, gdy przekazujesz wartość, a nie pozwalasz na wygenerowanie wartości. Zazwyczaj ludzie zawsze polegają na wygenerowanej wartości, więc normalnie użyjesz po prostu pierwszej wersji, GENERATED BY DEFAULT AS IDENTITY
.
GENEROWANE DOMYŚLNIE JAKO TOŻSAMOŚĆ
- Generuje wartość, chyba że
INSERT
polecenie dostarcza wartość.
- Generuje wartość, chyba że
GENEROWANE ZAWSZE JAKO TOŻSAMOŚĆ
- Ignoruje każdą wartość dostarczoną przez
INSERT
chyba że określiszNADPISYWANIE WARTOŚCI SYSTEMOWEJ
- Ignoruje każdą wartość dostarczoną przez
Zobacz CREATE TABLE
strona z dokumentacją.
Przeczytaj tę interesującą stronę
przez Petera Eisentrauta. Wyjaśnia kilka dziwnych problemów z SERIAL
. Brak takich problemów z nową funkcją kolumny tożsamości. Nie ma więc powodu, aby używać SERIAL
już bez wad, tylko wady; SERYJNE
jest zastępowane przez GENERATED … AS IDENTITY
.
Należy zauważyć, że kolumna tożsamości niekoniecznie jest kluczem podstawowym i nie jest indeksowana automatycznie. Więc nadal musisz określić PRIMARY KEY
wyraźnie, jeśli taka jest twoja intencja (jak zwykle).
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 )
) ;
Intencją jest, aby wewnętrzne szczegóły implementacji były przed Tobą ukryte. Nie musisz znać nazwy sekwencji generowanej pod przykrywką. Na przykład możesz zresetować licznik za pomocą kolumny bez znajomości podstawowej sekwencji.
ALTER TABLE person_
ALTER COLUMN id_
RESTART WITH 1000 -- Reset sequence implicitly, without a name.
;
Niejawne określenie tożsamości:
- Kolumna oznaczeń
NOT NULL
- Tworzy sekwencję
- Typ sekwencji pasuje do kolumny (32-bitowy 64-bitowy itd.)
- Wiąże sekwencję z kolumną
- Odziedzicza uprawnienia
- Kaskady spadają
- Pozostaje powiązana z kolumną, nawet jeśli nazwa kolumny została zmieniona
- Określa sekwencję jako źródło wartości domyślnych dla tej kolumny
Kolumna tożsamości może przyjmować te same opcje, co UTWÓRZ SEKWENCJĘ
:
ROZPOCZNIJ OD startu
MINVALUE minvalue
|BRAK MIN.WARTOŚCI
MAXVALUE maxvalue
|BRAK MAKSYMALNEJ WARTOŚCI
WZROST [O] przyrost
CYKL
|BRAK CYKLU
Pamięć podręczna
pamięć podręcznaNIE WŁAŚCICIELE
(określanie własności kolumny tożsamości nie ma dla mnie sensu, ponieważ własność jest zarządzana automatycznie)
Niemądry przykład opcji:
id_ INTEGER
GENERATED BY DEFAULT AS IDENTITY (
START WITH 200
MINVALUE 100
MAXVALUE 205
CYCLE
INCREMENT BY 3
) PRIMARY KEY
Dodawanie 4 wierszy: