Postgres 9.5 lub nowszy
IF NOT EXISTS
został dodany do CREATE SEQUENCE
w Postgresie 9.5. To teraz proste rozwiązanie:
CREATE SEQUENCE IF NOT EXISTS myschema.myseq;
Ale weź pod uwagę szczegóły nieaktualnej odpowiedzi...
I wiesz o serial
lub IDENTITY
kolumny, prawda?
- Automatyczna inkrementacja kolumny tabeli
Postgres 9.4 lub starszy
Sekwencje współdzielą przestrzeń nazw z kilkoma innymi obiektami podobnymi do tabeli. Instrukcja:
Nazwa sekwencji musi różnić się od nazwy każdej innej sekwencji, tabeli, indeksu, widoku lub tabeli obcej w tym samym schemacie.
Moje odważne podkreślenie. Są więc trzy przypadki:
- Nazwa nie istnieje. -> Utwórz sekwencję.
- Istnieje sekwencja o tej samej nazwie. -> Nic nie robić? Jakieś wyjście? Jakieś logowanie?
- Istnieje inny obiekt powodujący konflikt o tej samej nazwie. -> Zrobić coś? Jakieś wyjście? Jakieś logowanie?
Określ, co zrobić w obu przypadkach. DO
oświadczenie może wyglądać tak:
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$;
Typy obiektów (relkind
) w pg_class
zgodnie z instrukcją:
r =zwykła tabela
i =indeks
S =sekwencja
v =widok
m =widok zmaterializowany
c =typ złożony
t =tabela TOAST
f =tabela obca
Powiązane:
- Jak sprawdzić, czy tabela istnieje w danym schemacie