Postgres 9.5 eller senare
IF NOT EXISTS
lades till i CREATE SEQUENCE
i Postgres 9.5. Det är den enkla lösningen nu:
CREATE SEQUENCE IF NOT EXISTS myschema.myseq;
Men överväg detaljerna i det föråldrade svaret ändå ...
Och du vet om serial
eller IDENTITY
kolumner, eller hur?
- Automatisk ökning av tabellkolumnen
Postgres 9.4 eller äldre
Sekvenser delar namnutrymmet med flera andra tabellliknande objekt. Manualen:
Sekvensnamnet måste skilja sig från namnet på någon annansekvens, tabell, index, vy eller främmande tabell i samma schema.
Djärv betoning min. Så det finns tre fall:
- Namnet finns inte. -> Skapa sekvens.
- Det finns en sekvens med samma namn. -> Gör ingenting? Någon utgång? Någon loggning?
- Det finns ett annat objekt i konflikt med samma namn. -> Göra något? Någon utgång? Någon loggning?
Ange vad du ska göra i båda fallen. En DO
uttalande kan se ut så här:
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
enligt manualen:
r =vanlig tabell
i =index
S =sekvens
v =vy
m =materialiserad vy
c =sammansatt typ
t =TOAST-tabell
f =främmande tabell
Relaterat:
- Hur man kontrollerar om en tabell finns i ett givet schema