簡體   English   中英

PostgreSQL:如果不存在則創建表 AS

[英]PostgreSQL: Create table if not exists AS

我正在使用 PostgreSQL 並且是 SQL 初學者。 我正在嘗試從查詢創建一個表,如果我運行:

CREATE TABLE table_name AS
   (....query...)

它工作得很好。 但是,如果我添加“如果不存在”並運行:

CREATE TABLE IF NOT EXISTS table_name AS
   (....query...)

使用完全相同的查詢,我得到:

 ERROR: syntax error at or near "as"

有沒有辦法做到這一點?

CREATE TABLE AS被認為是與普通CREATE TABLE不同的語句,並且直到 Postgres 9.5 版(請參閱更改日志條目)不支持IF NOT EXISTS子句。 (請務必查看您正在使用的版本的正確版本的手冊。)

盡管不是很靈活,但CREATE TABLE ... 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 TABLE IF NOT EXISTS ...CREATE TABLE IF NOT EXISTS ...是在 Postgres 9.1 中添加的。 看:

Postgres 9.0 或更高版本

如果您打算為此編寫一個函數,請基於 系統目錄表pg_class ,而不是基於信息模式統計信息收集器(只有在激活時才存在)中的視圖。

CREATE OR REPLACE FUNCTION create_table_qry(_tbl text
                                          , _qry text
                                          , _schema text = NULL)
  RETURNS bool
  LANGUAGE plpgsql AS
$func$
DECLARE
   _sch text := COALESCE(_schema, current_schema());
BEGIN
   IF EXISTS (
      SELECT 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$;

該函數采用表名和查詢字符串,以及可選的模式來創建表(默認為當前模式)。

注意函數頭中:=和函數體中 : =的正確使用:

還要注意標識符如何轉義為標識符。 您不能使用regclass ,因為該表尚不存在:

嘗試這個,

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 

這很簡單:

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

使用做:

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 $$;

用於REDSHIFT PLPGSQL 風格的 CTAS(創建表 AS)。 Erwin Brandstetter 大喊使用純 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM