2013-03-07 1 views
7

해당 키가있는 경우 hstore 열의 특정 키에 대해 고유 한 인덱스 또는 제약 조건을 만들고 싶습니다. 나는 대답이 다른 질문 어딘가에 찾을 수 있었으면 좋겠습니다 :고유 인덱스 또는 hstore 키 제약 조건

Practical limitations of expression indexes in PostgreSQL

하지만 내가 가지고 올 수 있고 아무것도 작동하지 않을 것입니다 구문의 모든 버전을 시도했다.

현재 내 표는 hstore_table

hstore 필드

hstore_value 그리고 그들은 키 나는 그들이 존재하는 경우 고유은 '갑'과 '바'이다로 강제하고자하는 것입니다.

의 PostgreSQL 내 버전은 8.4.13 내가, 당신이 부분의 고유 기능 인덱스를 원하는 것을 정확하게 요구하고 이해 한 경우

답변

15

:

CREATE TABLE hstest (x hstore not null); 

CREATE UNIQUE INDEX hstest_key_k1_values_unique 
ON hstest((x -> 'k1')) 
WHERE (x ? 'k1'); 

WHERE 절은 아니다 키 참조가 발견되지 않았던 경우는 null가됩니다. 그것이 적절한 지 여부는 귀하의 질의에 달려 있습니다.

여러 개의 키가 필요하면 두 키를 독립적으로 사용하려면 두 개의 인덱스를 사용하거나 고유 한 제약 조건이 (1,2) 및 (1,3) 또는 (2,2)하지만 다른 (1,2)은 아닙니다.

CREATE UNIQUE INDEX hstest_key_k1k2_values_unique 
ON hstest ((x -> 'k1'), (x -> 'k2')); 
+0

Worked PERFECTLY! – trex005

+0

설명서에 "각 키 저장소는 고유합니다"라고되어 있습니다. 나는 왜 우리가 보여주는 인덱스 유형을 추가해야하는지 알지 못합니다. 내가 놓친 게 있니? – IamIC

+2

@IamIC 원래의 포스터는 두 개의 서로 다른 행 A와 B에 대해 hstore 필드 'h'가 두 행 사이에 같은 값을 갖는 동일한 키 'k'를 포함 할 수 없기를 바랬습니다. 즉 행'A.h {k = 1} '이 존재하면 행'B.h {k = 1}'의 삽입을 허용하지 않고'B.h {k = 2}'또는'B.h {x = 1} '의 삽입을 허용합니다. 'UNIQUE' 제약 조건과 같지만 컬럼 전체가 아닌 hstore 키의 값에 적용합니다. –