sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo crear una secuencia si no existe

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:

  1. El nombre no existe. -> Crear secuencia.
  2. Existe una secuencia con el mismo nombre. -> ¿No hacer nada? ¿Alguna salida? ¿Algún registro?
  3. 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