Postgres 9.5 o posterior
IF NOT EXISTS
se agregó a CREATE SEQUENCE
en Postgres 9.5. Esa es la solución simple ahora:
CREATE SEQUENCE IF NOT EXISTS myschema.myseq;
Pero considera los detalles de la respuesta desactualizada de todos modos...
Y sabes sobre serial
o IDENTITY
columnas, ¿verdad?
- Columna de tabla de incremento automático
Postgres 9.4 o anterior
Las secuencias comparten el espacio de nombres con varios otros objetos similares a tablas. El manual:
El nombre de la secuencia debe ser distinto del nombre de cualquier otra secuencia, tabla, índice, vista o tabla externa en el mismo esquema.
Énfasis en negrita mío. Así que hay tres casos:
- El nombre no existe. -> Crear secuencia.
- Existe una secuencia con el mismo nombre. -> ¿No hacer nada? ¿Alguna salida? ¿Algún registro?
- Existe otro objeto en conflicto con el mismo nombre. -> ¿Hacer algo? ¿Alguna salida? ¿Algún registro?
Especifique qué hacer en cada caso. Un DO
declaración podría verse así:
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$;
Tipos de objetos (relkind
) en pg_class
según el manual:
r =tabla ordinaria
i =índice
S =secuencia
v =vista
m =vista materializada
c =tipo compuesto
t =tabla TOAST
f =tabla extranjera
Relacionado:
- Cómo verificar si una tabla existe en un esquema dado