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

Jak stworzyć odpowiednik kolumny tożsamości serwera SQL w Postgresie

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ść.
  • GENEROWANE ZAWSZE JAKO TOŻSAMOŚĆ
    • Ignoruje każdą wartość dostarczoną przez INSERT chyba że określisz NADPISYWANIE WARTOŚCI SYSTEMOWEJ

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ęczna
  • NIE 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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aktualizuj sekwencję w wierszu INSERT

  2. Jaki jest format ciągu połączenia / adresu URL PostgreSQL?

  3. Metoda błędu Postgres org.postgresql.jdbc.PgConnection.createClob() nie jest zaimplementowana

  4. Jak włączyć TimescaleDB w istniejącej bazie danych PostgreSQL

  5. Czy PLV8 obsługuje wykonywanie połączeń http do innych serwerów?