Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:如果表不存在,则创建为_Sql_Postgresql_Create Table - Fatal编程技术网

PostgreSQL:如果表不存在,则创建为

PostgreSQL:如果表不存在,则创建为,sql,postgresql,create-table,Sql,Postgresql,Create Table,我正在使用PostgreSQL,我是SQL初学者。我正在尝试从查询创建表,如果运行: CREATE TABLE table_name AS (....query...) 它很好用。但如果我添加“如果不存在”并运行: CREATE TABLE IF NOT EXISTS table_name AS (....query...) 使用完全相同的查询,我得到: 有什么方法可以做到这一点吗?被认为是与普通语句不同的语句,直到Postgres 9.5版see才支持IF NOT EXISTS

我正在使用PostgreSQL,我是SQL初学者。我正在尝试从查询创建表,如果运行:

CREATE TABLE table_name AS
   (....query...)
它很好用。但如果我添加“如果不存在”并运行:

CREATE TABLE IF NOT EXISTS table_name AS
   (....query...)
使用完全相同的查询,我得到:

有什么方法可以做到这一点吗?

被认为是与普通语句不同的语句,直到Postgres 9.5版see才支持IF NOT EXISTS子句。请务必查看所使用版本的正确手册版本

尽管没有那么灵活,创建表。。。在某些情况下,LIKE语法可能是另一种选择;它不是从SELECT语句获取其结构和内容,而是复制另一个表或视图的结构

因此,你可以写一些像这样未经测试的东西;如果表已经填充,那么最后的插入是一种相当混乱的无所事事的方式:

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 );
或者,如果要放弃以前的数据,例如放弃的临时表,可以有条件地删除旧表,并无条件地创建新表:

DROP TABLE IF EXISTS temp_stuff;

CREATE TEMPORARY TABLE temp_stuff AS SELECT * FROM foo NATURAL JOIN bar;
试试这个

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 
如果不存在,请创建表。。。在Postgres 9.1中添加。见:

博士后9.0或以上 如果要为此编写函数,请基于,而不是基于或中仅在激活时才存在的视图

创建或替换函数创建表格文本 ,_qry文本 ,_schematext=NULL 返回布尔 语言plpgsql AS $func$ 声明 _sch文本:=合并模式,当前模式; 开始 如果存在 从pg_目录中选择。pg_c类 将pg_catalog.pg_命名空间n连接到n.oid=c.relnamespace 其中n.nspname=\u sch 和c.relname=\u tbl 然后 提出通知“姓名不免费:%。%”,请参见附件; 返回FALSE; 其他的 执行格式“创建表%I.%I作为%s”,请参见,待定,Y; 提出通知“已成功创建表格:%。%”,_sch,_tbl; 返回TRUE; 如果结束; 终止 $func$; 该函数接受表名和查询字符串,还可以选择使用模式创建表,默认为

注意在函数头中正确使用=和在函数体中正确使用:=:

还要注意标识符是如何作为标识符转义的。无法使用regclass,因为该表尚不存在:

很简单:

 CREATE TABLE IF NOT EXISTS abc ( sql_id BIGINT(20) NOT NULL
   AUTO_INCREMENT PRIMARY KEY, sender VARCHAR(20) NULL)
使用do:

do $$ begin

if not exists (  SELECT 1
   FROM   information_schema.tables 
   WHERE  table_schema = 'schema_name'
   AND    table_name = 'bla ') then

  create table schema_name.bla as select * from blu;
end if;

end $$;

CTA为红移PLPGSQL创建表AS。使用纯粹的PG语法大声说出根本的想法

CREATE
OR
REPLACE
PROCEDURE pipeline.sp_create_table_if_not_exists_as (sch VARCHAR, tbl VARCHAR, qry VARCHAR, tbl_attrs VARCHAR)
 AS
    /*
     specifically an exception for CTAS functionality: https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_AS.html
    */
$$
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 INFO 'Table already exists: %.%', sch, tbl;
ELSE
    EXECUTE 'CREATE TABLE ' || sch || '.' || tbl || ' ' || tbl_attrs || ' AS ' || qry;
    RAISE INFO 'Table created successfully: %.%, using query: [%], optional attributes: [%]', sch, tbl, qry, tbl_attrs;
END IF;

END;
$$
language plpgsql;

我会认真考虑你的建议。谢谢-我很感激。如果你想创建一个视图来复制表结构,你可以一直使用一个视图来代替它。@ErwinBrandstetter,没错。除非它也不接受IF NOT EXISTS子句;不过,如果存在实体化视图,则可以删除该视图。在不知道确切的用例的情况下,很难知道这些选项中的任何一个是否实际相关。@ErwinBrandstetter在支持功能的PostgreSQL版本中必须是特定的,因为物化视图支持PostgreSQL版本9.3和above@WingedPanther:正确。我倾向于假设Postgres的当前版本适用于那些不愿意声明实际使用的版本的问题。为了便于评论,我添加了另一个答案。通常,最好解释一个解决方案,而不是仅仅发布几行匿名代码。您可以阅读,也可以将海报中的“创建表”作为“不创建表”进行询问。对于“创建表”,支持是(如果不存在)
do $$ begin

if not exists (  SELECT 1
   FROM   information_schema.tables 
   WHERE  table_schema = 'schema_name'
   AND    table_name = 'bla ') then

  create table schema_name.bla as select * from blu;
end if;

end $$;

CREATE
OR
REPLACE
PROCEDURE pipeline.sp_create_table_if_not_exists_as (sch VARCHAR, tbl VARCHAR, qry VARCHAR, tbl_attrs VARCHAR)
 AS
    /*
     specifically an exception for CTAS functionality: https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_AS.html
    */
$$
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 INFO 'Table already exists: %.%', sch, tbl;
ELSE
    EXECUTE 'CREATE TABLE ' || sch || '.' || tbl || ' ' || tbl_attrs || ' AS ' || qry;
    RAISE INFO 'Table created successfully: %.%, using query: [%], optional attributes: [%]', sch, tbl, qry, tbl_attrs;
END IF;

END;
$$
language plpgsql;