Postgres 9.5 oder höher
IF NOT EXISTS
wurde zu CREATE SEQUENCE
hinzugefügt in Postgres 9.5. Das ist jetzt die einfache Lösung:
CREATE SEQUENCE IF NOT EXISTS myschema.myseq;
Aber bedenken Sie trotzdem die Details der veralteten Antwort ...
Und Sie kennen sich mit serial
aus oder IDENTITY
Spalten, richtig?
- Tabellenspalte automatisch erhöhen
Postgres 9.4 oder älter
Sequenzen teilen sich den Namensraum mit mehreren anderen tabellenähnlichen Objekten. Das Handbuch:
Der Sequenzname muss sich vom Namen aller anderen Sequenzen, Tabellen, Indizes, Ansichten oder Fremdtabellen unterscheiden im gleichen Schema.
Fette Hervorhebung von mir. Es gibt also drei Fälle:
- Name existiert nicht. -> Sequenz erstellen.
- Sequenz mit demselben Namen existiert. -> Nichts tun? Irgendeine Ausgabe? Protokollierung?
- Es existiert ein anderes widersprüchliches Objekt mit demselben Namen. -> Etwas tun? Irgendeine Ausgabe? Protokollierung?
Geben Sie an, was in beiden Fällen zu tun ist. Ein DO
Anweisung könnte so aussehen:
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$;
Objekttypen (relkind
) in pg_class
laut Handbuch:
r =gewöhnliche Tabelle
i =Index
S =Sequenz
v =Ansicht
m =materialisierte Ansicht
c =zusammengesetzter Typ
t =TOAST-Tabelle
f =fremde Tabelle
Verwandte:
- Überprüfen, ob eine Tabelle in einem bestimmten Schema existiert