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:
- Il nome non esiste. -> Crea sequenza.
- Esiste una sequenza con lo stesso nome. -> Non fare niente? Qualche uscita? Qualche registrazione?
- 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