2014-02-07 4 views
3

꽤 간단한 질문처럼 보입니다. 그러나 온라인에서 특정 응답을 찾을 수없는 것 같습니다.여러 열의 고유 인덱스에서 한 열에 NULL 값을 허용하는 방법

견적과 광고 항목 모두를 참조하는 price 모델이 있으므로 및 line_item_id 열이 있습니다. 동일한 line_item에 대한 여러 가격이 견적에 첨부되지 않도록하려면 복수 열 인덱스 unique: true을 사용하고 있습니다. quote_id은 색인의 첫 번째 열입니다.

그러나 사용자가 가격을 line_items에 추가 할 수 있도록 허용하고 싶습니다. 하나의 가격으로도 제대로 작동하지만 은 null이고 line_item_id이 있습니다. 그러나 고유 색인을 사용하면 두 번째 가격을 동일한 line_item에 첨부 할 수 없습니다. quote_id의 널 (NULL) 값은 고유 한 것으로 처리됩니다.

고유 제한 조건을 인용 부호가 null이 아닌 경우에만 적용 할 수있는 방법이 있습니까?
allow_nil은 모델 검증에 사용할 수 있지만 인덱스에서 사용할 수 있습니까?

내가 같은 생각입니다 :

add_index :prices, [:quote_id, :line_item_id], :unique => true, :allow_nil => true 

PostgreSQL을하고 레일 4

+0

링크를 이용해 주셔서 감사합니다. 따라서 allow_nil은 필요하지 않지만 문제는 열 순서대로 나타납니다. 만약 내가 배치 : line_item_id 전에 : quote_id 색인에, 내가 quote_id에 대한 NULL로 여러 동일한 line_item_ids 찾고 무엇을 허용해야합니다. – FothMan

답변

2

는 따옴표가 null가 아닌 경우 고유 제한 조건에만 적용 할 수있는 방법이 있습니까?

사실, 이것은 방법입니다. Postgres는 (대부분의 컨텍스트에서와 같이)이 목적으로 두 개의 NULL 값이 동일하지 않으므로 복수 열 인덱스에서 하나 이상의 열이 NULL 인 여러 개의 "동일한"항목을 가질 수 있습니다.

색인의 열 순서는 중요하지 않습니다. (It matters for other purposes, though.)

표 자체의 기본 열이 NULL 일 수 있는지 확인하십시오. (. 때때로 빈 문자열 ''과 혼동)

질문을 다시 읽은 후 더 적합한 시나리오는이 관련 해답이 될 것 같다 :
Create a multicolumn index to enforce uniqueness
이 하나도 도움이 될 수 있지만, 문제는 묻는다 당신의 반대을 위해 :
How to add a conditional unique index on PostgreSQL

경우에 당신은 실제로 당신이도 그렇게 할 수 만 null이 아닌 값을 가진 partial index을 원하는 :

CREATE INDEX price_uni_idx ON price (quote_id, line_item_id) 
WHERE quote_id  IS NOT NULL 
AND line_item_id IS NOT NULL; 

당신은 당신의 목적을 위해,하지만이 필요하지 않습니다. NULL 값을 가진 행을 인덱스에서 제외하여 더 빨리 만들면 유용 할 수 있습니다.여기 세부 정보 :
Indexed ORDER BY with LIMIT 1

+1

감사합니다 - 이것은 내가 필요한 답입니다. 나는 제대로 작동 할 수있었습니다. – FothMan