Postgres 9.5 или по-нова версия
IF NOT EXISTS
беше добавен към CREATE SEQUENCE
в Postgres 9.5. Това е простото решение сега:
CREATE SEQUENCE IF NOT EXISTS myschema.myseq;
Но все пак помислете за подробностите за остарелия отговор ...
И знаете за serial
или IDENTITY
колони, нали?
- Колона на таблицата с автоматично увеличение
Postgres 9.4 или по-стара версия
Последователностите споделят пространството от имена с няколко други подобни на таблица обекта. Ръководството:
Името на последователността трябва да се различава от името на всяка другапоследователност, таблица, индекс, изглед или чужда таблица в същата схема.
Удебелен акцент мой. Така че има три случая:
- Име не съществува. -> Създаване на последователност.
- Съществува последователност със същото име. -> Да не правиш нищо? Някакъв изход? Някакво регистриране?
- Съществува друг конфликтен обект със същото име. -> Направете нещо? Някакъв изход? Някакво регистриране?
Посочете какво да правите и в двата случая. A DO
изявлението може да изглежда така:
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$;
Типове обекти (relkind
) в pg_class
според ръководството:
r =обикновена таблица
i =индекс
S =последователност
v =изглед
m =материализиран изглед
c =съставен тип
t =TOAST таблица
f =чужда таблица
Свързано:
- Как да проверите дали таблица съществува в дадена схема