web-dev-qa-db-ja.com

選択から一時テーブルを作成するか、テーブルがすでに存在する場合は挿入します

一時テーブルがまだ存在しない場合に作成し、選択した行を追加する最良の方法は何ですか?

14
inf3rno

_CREATE TABLE AS_

最も簡単で最速の方法です:

_CREATE TEMP TABLE tbl AS
SELECT * FROM tbl WHERE ... ;
_

テーブルがすでに存在するかどうかわからない

_CREATE TABLE IF NOT EXISTS ..._ はバージョンPostgres 9.1で導入されました。
古いバージョンの場合、この関連回答で提供されている関数を使用します。
PostgreSQLが存在しない場合はテーブルを作成

次に:

_INSERT INTO tbl (col1, col2, ...)
SELECT col1, col2, ...
_

一時テーブルが既に存在する場合、コードで問題が発生している可能性があります。テーブル内のデータなどを複製しないでください。または、次の段落を検討してください...

一意の名前

一時テーブルは現在のセッション内でのみ表示されます(トランザクションと混同しないでください!)。したがって、テーブル名は他のセッションと競合することはできません。
Ifセッション内で一意の名前が必要な場合は、動的SQLを使用してSEQUENCEを利用できます。

一度作成:

_CREATE SEQUENCE tablename_helper_seq;
_

DOステートメント(またはplpgsql関数)を使用できます。

_DO
$do$
BEGIN

EXECUTE
'CREATE TEMP TABLE tbl' || nextval('tablename_helper_seq'::regclass) || ' AS
SELECT * FROM tbl WHERE ... ';

RAISE NOTICE 'Temporary table created: "tbl%"' || ', lastval();
END
$do$;
_

lastval()およびcurrval(regclass) は、この場合、実際に使用されている名前を取得するために役立ちます。

29