[英]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 中添加的。 看:
如果您打算為此編寫一個函數,請基於 系統目錄表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.