색인이 존재하지 않으면 색인을 추가 할 수있는 기능을 개발 중입니다. 비교할 인덱스 목록을 얻을 수없는 문제가 발생했습니다. 이견있는 사람?
이것은이 코드로 해결 된 열 생성 문제와 비슷한 문제입니다.
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 commit https://github.com/postgres/postgres/commit/08309aaf74ee879699165ec8a2d53e56f2d2e947
pg 해커에 대한 토론 http://postgresql.nabble.com/CREATE-IF-NOT-EXISTS-INDEX-td5821173.html