sql >> Database >  >> RDS >> PostgreSQL

Het equivalent van de identiteitskolom van een SQL Server maken in Postgres

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.
  • GENERATED ALWAYS AS IDENTITY
    • Negeert elke waarde geleverd door INSERT tenzij OVERRIDING SYSTEM VALUE . wordt opgegeven

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 cache
  • OWNED 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:



  1. Hoe het resultaat van de Oracle-databasefunctie via ODBC op te halen?

  2. Toon records van nu() tot de volgende 7 dagen in mysql

  3. MySQL uitleg voor DELETE-query's

  4. Syntaxisfout in de buurt van 'of' in de full-text zoekvoorwaarde 'control of'