web-dev-qa-db-ja.com

PostgreSQL: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"

これを行う方法はありますか?

20
user3591836

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;
16
IMSoP

このための関数を作成する場合は、 システムカタログテーブルpg_class に基づいてください。 情報スキーマ または 統計コレクタ (アクティブ化されている場合のみ存在する)のビュー。

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;

この関数はテーブル名とクエリ文字列を受け取り、オプションでテーブルを作成するスキーマも受け取ります(デフォルトは 現在のスキーマ です)。

関数ヘッダーで=を、関数本体で:=を正しく使用していることに注意してください。

また、識別子が識別子としてエスケープされる方法にも注意してください。テーブルが存在しないため、regclassは使用できません。

4

簡単です:

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

これを試して、

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 
0
Vivek S.

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

0
Stéphane Goyet