インデックスが存在しない場合にインデックスを追加できる機能に取り組んでいます。比較するインデックスのリストを取得できないという問題に直面しています。何かご意見は?
これは、次のコードで解決される列作成の問題と同様の問題です:https :
//stackoverflow.com/a/12603892/368511
インデックスが存在しない場合にインデックスを追加できる機能に取り組んでいます。比較するインデックスのリストを取得できないという問題に直面しています。何かご意見は?
これは、次のコードで解決される列作成の問題と同様の問題です:https :
//stackoverflow.com/a/12603892/368511
回答:
インデックスの名前を気にしない場合は、Postgresに自動的に名前を付けてください:
CREATE INDEX ON tbl1 (col1);
(ほぼ)同じです:
CREATE INDEX tbl1_col1_idx ON tbl1 USING btree (col1);
Postgresが名前の衝突を避けて、次の自由な名前を自動的に選択することを除いて:
tbl1_col1_idx
tbl1_col1_idx2
tbl1_col1_idx3
...
やってみなよ。しかし、明らかに、複数の冗長なインデックスを作成したくないでしょう。そのため、盲目的に新しいものを作成するのは得策ではありません。
テストする非常に簡単な方法は、スキーマ修飾名をregclass
以下にキャストすることです。
SELECT 'myschema.myname'::regclass;
例外がスローされた場合、名前は無料です。
または、例外をスローせずに同じことをテストするには、DO
ステートメントで使用します:
DO
$$
BEGIN
IF NOT EXISTS (
SELECT
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname = 'mytable_mycolumn_idx'
AND n.nspname = 'myschema'
) THEN
CREATE INDEX mytable_mycolumn_idx ON myschema.mytable (mycolumn);
END IF;
END
$$;
このCREATE INDEX CONCURRENTLY
バリアントは外部トランザクションでラップできないため、これは機能しません。以下の@Gregoryによるコメントを参照してください。
このDO
ステートメントはPostgres 9.0で導入されました。以前のバージョンでは、同じことを行う関数を作成する必要があります。マニュアルの
詳細。マニュアルのインデックス
に関する基本。pg_class
新しい関数to_regclass()
を使用して、例外をスローせずにチェックできます。
DO
$$
BEGIN
IF to_regclass('myschema.mytable_mycolumn_idx') IS NULL THEN
CREATE INDEX mytable_mycolumn_idx ON myschema.mytable (mycolumn);
END IF;
END
$$;
その名前のインデックス(または別のオブジェクト)が存在しない場合はNULLを返します。見る:
現在利用可能:
CREATE INDEX IF NOT EXISTS ...
それはにも有効ですCREATE INDEX CONCURRENTLY IF NOT EXISTS
。
ただし、マニュアルでは次のように警告しています:
既存のインデックスが作成されたもののようなものであるという保証はないことに注意してください。
オブジェクト名の単純なチェックです。ここのすべてのバリアントに適用されます。
CONCURRENTLY
この方法ではインデックスを追加できないことに注意してください。取得しERROR: CREATE INDEX CONCURRENTLY cannot be executed from a function or multi-command string
ます。
9.5で利用可能になります。これが実際のgitコミットですhttps://github.com/postgres/postgres/commit/08309aaf74ee879699165ec8a2d53e56f2d2e947
pgハッカーに関する議論http://postgresql.nabble.com/CREATE-IF-NOT-EXISTS-INDEX-td5821173.html