En un script MySQL puedes escribir:
CREATE TABLE IF NOT EXISTS foo ...;
... otras cosas ...
y luego puede ejecutar el script muchas veces sin volver a crear la tabla.
¿Cómo se hace esto en PostgreSQL?
fuente
En un script MySQL puedes escribir:
CREATE TABLE IF NOT EXISTS foo ...;
... otras cosas ...
y luego puede ejecutar el script muchas veces sin volver a crear la tabla.
¿Cómo se hace esto en PostgreSQL?
Esta característica 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 solucionarlo:
CREATE OR REPLACE FUNCTION create_mytable ()
RETURNS void 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$ LANGUAGE plpgsql;
Llamada:
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 cita entre comillas los identificadores en la CREATE TABLE
declaración, debe usar exactamente la misma ortografía. Si no lo hace, debe usar cadenas en minúsculas. Ver:
pg_tables
solo contiene tablas reales . El identificador aún puede estar ocupado por objetos relacionados. Ver:
Si el rol que ejecuta esta función no tiene los privilegios necesarios para crear la tabla, es posible que desee utilizarla SECURITY DEFINER
para que la función sea propiedad de otro rol con los privilegios necesarios. Esta versión es lo suficientemente segura.
CREATE FUNCTION
única vez. EsSELECT create_mytable();
posible que desee llamar muchas veces.Prueba esto:
fuente
IF NOT EXISTS
opción.Creé una solución genérica a partir de las respuestas existentes que se pueden reutilizar para cualquier tabla:
Uso:
Se podría simplificar aún más si se toma un solo parámetro si se extrae el nombre de la tabla del parámetro de consulta. También omití los esquemas.
fuente
Esta solución es algo similar a la respuesta de Erwin Brandstetter, pero usa solo el lenguaje sql.
No todas las instalaciones de PostgreSQL tienen el lenguaje plpqsql por defecto, esto significa que puede que tenga que llamar
CREATE LANGUAGE plpgsql
antes de crear la función, y luego tener que eliminar el idioma nuevamente, para dejar la base de datos en el mismo estado que tenía antes (pero solo si la base de datos no tenía el lenguaje plpgsql para empezar). ¿Ves cómo crece la complejidad?Agregar el plpgsql puede no ser un problema si está ejecutando su script localmente, sin embargo, si el script se usa para configurar el esquema en un cliente, puede no ser conveniente dejar cambios como este en la base de datos de clientes.
Esta solución está inspirada en una publicación de Andreas Scherbaum .
fuente
No existe CREAR TABLA SI NO EXISTE ... pero puede escribir un procedimiento simple para eso, algo como:
fuente
No existe CREAR TABLA SI NO EXISTE ... pero puede escribir un procedimiento simple para eso, algo como:
fuente