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

Jak vytvořit ekvivalent sloupce identity SQL Serveru v Postgresu

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.
  • GENERATED ALWAYS AS IDENTITY
    • Ignoruje jakoukoli hodnotu poskytnutou příkazem INSERT pokud neurčíte OVERRIDING SYSTEM VALUE

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ů:



  1. Oracle Update Column LTRIM a RTRIM

  2. Synchronizujte 2 tabulky různých databází - MySQL

  3. Simulujte ORDER BY v SQLite UPDATE, abyste zvládli omezení jedinečnosti

  4. Smyčka přes MySQL levé spojení v php vs. 2 samostatné dotazy