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

PostgreSQL crear tabla si no existe

Esta función se ha implementado en Postgres 9.1 :

CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);

Para versiones anteriores , aquí hay una función para evitarlo:

CREATE OR REPLACE FUNCTION create_mytable()
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   IF EXISTS (SELECT FROM pg_catalog.pg_tables 
              WHERE  schemaname = 'myschema'
              AND    tablename  = 'mytable') THEN
      RAISE NOTICE 'Table myschema.mytable already exists.';
   ELSE
      CREATE TABLE myschema.mytable (i integer);
   END IF;
END
$func$;

Llamar:

SELECT create_mytable();        -- call as many times as you want. 

Notas:

  • Las columnas schemaname y tablename en pg_tables distinguen entre mayúsculas y minúsculas. Si usa comillas dobles para los identificadores en CREATE TABLE declaración, necesita usar exactamente la misma ortografía. Si no lo hace, necesita usar cadenas en minúsculas. Ver:

  • ¿Los nombres de las columnas de PostgreSQL distinguen entre mayúsculas y minúsculas?

  • pg_tables solo contiene tablas reales . El identificador aún puede estar ocupado por objetos relacionados. Ver:

  • Cómo verificar si existe una tabla en un esquema dado

  • Si el rol ejecutando esta función no tiene los privilegios necesarios para crear la tabla que tal vez quiera usar SECURITY DEFINER para la función y convertirla en propiedad por otro rol con los privilegios necesarios. Esta versión es lo suficientemente segura.