この機能はPostgres9.1で実装されています :
CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);
古いバージョンの場合 、これを回避する関数は次のとおりです:
CREATE OR REPLACE FUNCTION create_mytable()
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
IF EXISTS (SELECT FROM pg_catalog.pg_tables
WHERE schemaname = 'myschema'
AND tablename = 'mytable') THEN
RAISE NOTICE 'Table myschema.mytable already exists.';
ELSE
CREATE TABLE myschema.mytable (i integer);
END IF;
END
$func$;
電話:
SELECT create_mytable(); -- call as many times as you want.
注:
-
列
schemaname
およびtablename
pg_tables
で 大文字と小文字が区別されます。CREATE TABLE
で識別子を二重引用符で囲む場合 ステートメントでは、まったく同じスペルを使用する必要があります。そうでない場合は、小文字の文字列を使用する必要があります。参照: -
PostgreSQLの列名では大文字と小文字が区別されますか?
-
pg_tables
実際のテーブルのみが含まれています 。識別子は、関連するオブジェクトによって占有されている可能性があります。参照: -
特定のスキーマにテーブルが存在するかどうかを確認する方法
-
役割が実行中の場合 この関数には、
SECURITY DEFINER
を使用する可能性のあるテーブルを作成するために必要な権限がありません。 関数のために、それを所有にします 必要な特権を持つ別の役割によって。このバージョンは十分に安全です。