2011-08-09 2 views
2

내가 지금 scehma내가 NULLable 필드에 고유 한 제약을 가질 수 있습니까?

다음
CREATE TABLE MyTable 
( 
    ID    INTEGER DEFAULT(1,1), 
    FirstIdentifier INTEGER NULL, 
    SecondIdentifier INTEGER NULL, 
--.... some other fields ..... 
) 

FirstIdentifier & SecondIdentifier isUnique에 있지만 NULL이 허용의 각각의 테이블이있다. 각 열에 고유 한 제약 조건을 넣고 싶지만 nullable이고 고유 한 제약 조건에 실패 할 NULL 값을 가진 두 개의 행을 가질 수 있기 때문에이 열을 수행 할 수 없습니다. 스키마 수준에서 어떻게 해결할 수 있습니까?

+0

일부 트리거를 추가하여 삽입/업데이트를 캐치하고 해당 수준에서 고유성 검사를 수행 하시겠습니까? –

+0

FirstIdentifier와 Secondidentifier 합성 키를 만드는 방법은 어떻습니까? – Vinay

+0

'후보 키 {FirstIdentifier, SecondIdentifier}'또는 '후보 키 1 {FirstIdentifier}', '후보 키 2 {SecondIdentifier}'를 작성하려고하십니까? –

답변

7

필터링 된 인덱스를 고유 제한 조건으로 사용할 수 있습니다.

create unique index ix_FirstIdentifier on MyTable(FirstIdentifier) 
    where FirstIdentifier is not null 
0

귀하의 질문에 약간 혼란이 있습니다. 첫째, 스키마 정의에서 열이 null 값을 보유 할 수 없다고하지만, 설명에서 null이 될 수 있다고 말합니다.

어쨌든 스키마가 잘못되었다고 가정하고 실제로 열에 null 값이 허용되기를 원한다면 SQL Server는 제약 조건에 WHERE IS NOT NULL을 추가하여이 작업을 수행 할 수 있습니다. 의 라인을 따라

뭔가 :

CREATE UNIQUE NONCLUSTERED INDEX IDX_my_index 
ON MyTable (firstIdentifier) 
WHERE firstIdentifier IS NOT NULL 
0

이 필드에 필터링 된 고유 인덱스를 수행

CREATE UNIQUE INDEX ix_IndexName ON MyTable (FirstIdentifier, SecondIdentifier) 
    WHERE FirstIdentifier IS NOT NULL 
    AND SecondIdentifier IS NOT NULL 

그것은 NULL을 허용하지만 여전히 고유성을 적용합니다.

0

당신은 [CLUSTERED [UNIQUE]을 CREATE

CREATE INDEX

부터 CREATE INDEX에 필터 조건을 사용할 수 있습니다 | NONCLUSTERED] INDEX의 INDEX_NAME
ON (열 [ASC | DESC], ... N])
[INCLUDE (COLUMN_NAME [... N])]
[WHERE <filter_predicate>]
[WITH ([, ... n])]
[ON {partition_scheme_name (column_name)
| 파일 그룹 이름
| 기본값
}

[FILESTREAM_ON {filestream_filegroup_name | partition_scheme_name | "NULL"}]

[; ]

WHERE <filter_predicate> 색인에 포함 할 행이 인 것을 지정하여 필터링 된 색인을 작성합니다. 필터링 된 인덱스는 테이블의 비 클러스터형 인덱스 여야합니다. 필터링 된 색인의 데이터 행 에 대한 필터링 된 통계를 만듭니다.

필터 조건부는 단순 비교 논리를 사용하며 계산 열, UDT 열, 공간 데이터 형식 열 또는 hierarchyID 데이터 형식 열을 참조 할 수 없습니다. NULL 리터럴을 사용한 비교는 비교 연산자에 허용 된 이 아닙니다. 대신에 IS NULL 및 IS NOT NULL 연산자를 사용하십시오.여기

는 Production.BillOfMaterials 테이블 필터 조건의 예이다 :

WHERE STARTDATE> '20040101'AND 종료 날짜 < = '20040630'

한 ComponentID IN (533, 324, 753)

WHERE STARTDATE IN ('20040404', '20040905')과 종료 날짜는 NULL

필터링 된 인덱스는 XML 인덱스 및 전체 텍스트 인덱스에 적용되지 않습니다지지 않습니다. UNIQUE 인덱스의 경우 선택한 행에만 고유 인덱스 값이 있어야합니다. 필터링 된 인덱스는 IGNORE_DUP_KEY 옵션을 허용하지 않습니다.

1

필터링 된 색인을 사용하는 것이 아마도 원하는 것을 얻는 방법 일 것입니다.

그러나 직접적인 질문에 대한 책 응답은 고유 색인이있는 경우 열을 Null 허용 할 수 있지만 해당 열은 필드에 Null 값이있는 행 하나만 가질 수 있습니다. 하나 이상의 null이 인덱스를 위반합니다.

관련 문제