PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come creare una sequenza se non esiste

Postgres 9.5 o successivo

IF NOT EXISTS è stato aggiunto a CREATE SEQUENCE in Postgres 9.5. Questa è la soluzione semplice ora:

CREATE SEQUENCE IF NOT EXISTS myschema.myseq;

Ma considera comunque i dettagli della risposta obsoleta ...
E conosci il serial o IDENTITY colonne, giusto?

  • Colonna tabella con incremento automatico

Postgres 9.4 o precedente

Le sequenze condividono lo spazio dei nomi con molti altri oggetti simili a tabelle. Il manuale:

Il nome della sequenza deve essere distinto dal nome di qualsiasi altra sequenza, tabella, indice, vista o tabella esterna nello stesso schema.

Enfasi in grassetto mio. Quindi ci sono tre casi:

  1. Il nome non esiste. -> Crea sequenza.
  2. Esiste una sequenza con lo stesso nome. -> Non fare niente? Qualche uscita? Qualche registrazione?
  3. Esiste un altro oggetto in conflitto con lo stesso nome. -> Fare qualcosa? Qualche uscita? Qualche registrazione?

Specificare cosa fare in entrambi i casi. Un DO la dichiarazione potrebbe essere simile a questa:

DO
$do$
DECLARE
   _kind "char";
BEGIN
   SELECT relkind
   FROM   pg_class
   WHERE  oid = 'myschema.myseq'::regclass  -- sequence name, optionally schema-qualified
   INTO  _kind;

   IF NOT FOUND THEN       -- name is free
      CREATE SEQUENCE myschema.myseq;
   ELSIF _kind = 'S' THEN  -- sequence exists
      -- do nothing?
   ELSE                    -- object name exists for different kind
      -- do something!
   END IF;
END
$do$;

Tipi di oggetti (relkind ) in pg_class secondo il manuale:

r =tabella ordinaria
i =indice
S =sequenza
v =vista
m =vista materializzata
c =tipo composito
t =tabella TOAST
f =tabella straniera

Correlati:

  • Come verificare se esiste una tabella in un determinato schema