primary - PostgreSQL: Crear tabla si no existe AS
crear tablas en postgresql primary key (4)
Estoy usando PostgreSQL y soy un principiante de SQL. Estoy tratando de crear una tabla a partir de una consulta, y si ejecuto:
CREATE TABLE table_name AS
(....query...)
funciona bien Pero luego si agrego ''si no existe'' y ejecuto:
CREATE TABLE IF NOT EXISTS table_name AS
(....query...)
Usando exactamente la misma consulta, obtengo:
ERROR: syntax error at or near "as"
¿Hay alguna manera de hacer esto?
Es sencillo:
CREATE TABLE IF NOT EXISTS abc ( sql_id BIGINT(20) NOT NULL
AUTO_INCREMENT PRIMARY KEY, sender VARCHAR(20) NULL)
Prueba esto,
create or replace function create_table(tblname text) returns text as
$$
BEGIN
$1 = trim($1);
IF not EXISTS (select relname from pg_stat_user_tables where relname =$1) THEN
execute ''create table ''||$1||'' as select * from tbl''; -- <put your query here>
return ''''||$1||'' Created Successfully !!'';
else
return ''''||$1||'' Already Exists !!'';
END IF;
END
$$
language plpgsql
create or replace function create_table_qry(tblname text,qry text) returns text as
$$
BEGIN
$1 = trim($1);
IF not EXISTS (select relname from pg_stat_user_tables where relname =$1) THEN
execute ''create table ''||$1||'' as ''||$2||'''';
return ''''||$1||'' Created Successfully !!'';
else
return ''''||$1||'' Already Exists !!'';
END IF;
END
$$
language plpgsql
Si va a escribir una función para esto, base en la tabla de catálogo del sistema pg_class
, no en las vistas en el esquema de información o el recopilador de estadísticas (que solo existe si está activado).
CREATE OR REPLACE FUNCTION create_table_qry(_tbl text
, _qry text
, _schema text = NULL)
RETURNS bool AS
$func$
DECLARE
_sch text := COALESCE(_schema, current_schema());
BEGIN
IF EXISTS (
SELECT 1
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = _sch
AND c.relname = _tbl
) THEN
RAISE NOTICE ''Name is not free: %.%'',_sch, _tbl;
RETURN FALSE;
ELSE
EXECUTE format(''CREATE TABLE %I.%I AS %s'', _sch, _tbl, _qry);
RAISE NOTICE ''Table created successfully: %.%'',_sch, _tbl;
RETURN TRUE;
END IF;
END
$func$ LANGUAGE plpgsql;
La función toma un nombre de tabla y la cadena de consulta y, opcionalmente, también un esquema para crear la tabla (de manera predeterminada, el esquema actual ).
Tenga en cuenta el uso correcto de =
en el encabezado de la función y :=
en el cuerpo de la función:
También tenga en cuenta cómo los identificadores se escapan como identificadores. No puedes usar regclass
, ya que la tabla no existe, aún:
CREATE TABLE AS se considera una declaración separada de una CREATE TABLE normal, y hasta que Postgres versión 9.5 (ver entrada de registro de cambios ) no admite una cláusula IF NOT EXISTS
. (Asegúrese de mirar la versión correcta del manual para la versión que está usando).
Aunque no es tan flexible, la sintaxis de CREATE TABLE ... LIKE
puede ser una alternativa en algunas situaciones; En lugar de tomar su estructura (y contenido) de una declaración SELECT
, copia la estructura de otra tabla o vista.
En consecuencia, podría escribir algo como esto (no probado); la inserción final es una forma un tanto desordenada de no hacer nada si la tabla ya está llena:
CREATE OR REPLACE VIEW source_data AS SELECT * FROM foo NATURAL JOIN bar;
CREATE TABLE IF NOT EXISTS snapshot LIKE source_data;
INSERT INTO snapshot
SELECT * FROM source_data
WHERE NOT EXISTS ( SELECT * FROM snapshot );
Alternativamente, si desea descartar los datos anteriores (por ejemplo, una tabla temporal abandonada), podría eliminar la tabla anterior de forma condicional y crear la nueva incondicionalmente:
DROP TABLE IF EXISTS temp_stuff;
CREATE TEMPORARY TABLE temp_stuff AS SELECT * FROM foo NATURAL JOIN bar;