2017-12-18 2 views
2

Postgresql> = 10이라고 가정하면 두 개의 고유 한 값을 갖도록 테이블을 제한하는 방법이 있습니까? (이상) 열? 즉, 값은 열 중 하나에서만 나타날 수 있습니다. 가능한 한 트리거를 피하고 싶습니다. 사소한 단일 컬럼의 경우.두 개의 열 중 고유 한 것

은의이 테이블을 보자 : 이미 4 3이 있기 때문에 8 4이 불가능하다 동안

CREATE TABLE foo (
    col1 INTEGER, 
    col2 INTEGER 
); 

은 그래서

1 2 
4 3 
5 7 

을해야합니다.

은 지금까지 나는 EXCLUDE ((ARRAY[col1, col2]) WITH &&)을 제한하는 것이 가능이 될 수 생각하지만 (아직?) 지원되지 않는 것 같다

ERROR: operator &&(anyarray,anyarray) is not a member of operator family "array_ops" 

이 요구 사항이 빈 내부에 가입 테이블 (on a.col1 = b.col2)로 보일 수도 있습니다. 나는 방아쇠를 사용할 수 있다고 생각하지만 가능한 한 그 방아쇠를 피하고 싶습니다.

P. S. 여기에 a related question입니다.

+0

이유를 설명해 주시겠습니까? 나는 그것이 [열쇠 만이 아니다] (https://en.wikipedia.org/wiki/Third_normal_form# "Nothing_but_the_key") 규칙을 어기는 것으로 생각한다. 아니면 [XY 문제] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)일까요? – Adam

+1

어떻게이 두 숫자를 사용합니까? 단일 정수 열이있는 표를 만들 수없는 이유는 무엇입니까? "col1"또는 "col2"로 사용되는지 나타내는 varchar 열 (이 이름은별로 도움이되지 않습니다). 당신은 간단한 고유 인덱스 –

+0

@ a_horse_with_no_name을 사용할 수 있습니다 :'col1'과'cols2'는 값이 똑같이 중요하고 상호 교환 가능하다는 것을 의미합니다. 이러한 값은 쌍을 구성해야하기 때문에 하나의 열에있을 수 없습니다. – Igor

답변

1

나는 꽤 사용자 this answer이 당신이 달성하고자하는 것에 아주 가깝지만 답변에서 언급 한 바와 같습니다. 사실 일반적인 방법이 아니므로이 작업을 수행하는 방법은 없습니다. 프로그래밍에서 이와 같은 일이 발생하면 대체적이고 더 이상적인 솔루션을 찾기 위해 일부 데이터베이스 리팩토링을 수행하는 것이 좋습니다. 도움이 되길 바랍니다!

관련 문제