Postgres 9.5 eller nyere
IF NOT EXISTS
blev tilføjet til CREATE SEQUENCE
i Postgres 9.5. Det er den enkle løsning nu:
CREATE SEQUENCE IF NOT EXISTS myschema.myseq;
Men overvej detaljerne i det forældede svar alligevel ...
Og du kender til serial
eller IDENTITY
kolonner, ikke?
- Automatisk stigning i tabelkolonnen
Postgres 9.4 eller ældre
Sekvenser deler navnerummet med flere andre tabellignende objekter. Manualen:
Sekvensnavnet skal være forskelligt fra navnet på enhver andensekvens, tabel, indeks, visning eller fremmed tabel i samme skema.
Fed fremhævelse min. Så der er tre tilfælde:
- Navnet findes ikke. -> Opret sekvens.
- Der findes en sekvens med samme navn. -> Gør du ingenting? Noget output? Nogen logning?
- Der findes et andet modstridende objekt med samme navn. -> Gøre noget? Noget output? Nogen logning?
Angiv, hvad du skal gøre i begge tilfælde. En DO
sætning kunne se sådan ud:
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$;
Objekttyper (relkind
) i pg_class
ifølge manualen:
r =almindelig tabel
i =indeks
S =sekvens
v =udsigt
m =materialiseret visning
c =sammensat type
t =TOAST-bord
f =fremmed tabel
Relateret:
- Sådan kontrollerer du, om en tabel findes i et givet skema