MySQL スクリプトでは次のように記述できます。
CREATE TABLE IF NOT EXISTS foo ...;
... 他のもの ...
その後、テーブルを再作成せずにスクリプトを何度でも実行できます。
PostgreSQL でこれをどうやって行うのでしょうか?
ベストアンサー1
この機能はPostgres 9.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
、正確に同じスペルを使用する必要があります。そうしない場合は、小文字の文字列を使用する必要があります。参照:
pg_tables
実際のテーブルのみが含まれます。識別子は関連オブジェクトによって占有されている可能性があります。参照:
この関数を実行するロールにテーブルを作成するために必要な権限がない場合は、SECURITY DEFINER
関数を作成し、必要な権限を持つ別のロールがその関数を所有するようにします。このバージョンは十分に安全です。