sql - 제약조건 - 제약 조건을 활성화하지 못했습니다. 하나 이상의 행에 not null unique 또는 외래 키 제약 조건을 위반하는 값이 있습니다
SQL 제약 조건 고유 값 검증 (1)
필터링 된 고유 색인을 사용할 수 있습니다.
create table [t](
[id] [int] NULL,
[date] [datetime] NULL,
[passport] [char](8) NULL,
[deleted] [int] NULL
)
create unique index unq_t_date_passport on t(date, passport)
where deleted = 0;
편집하다:
SQL Server 버전에서 필터링 된 인덱스가 작동하지 않는 경우 호환성 수준 을 확인할 수 있습니다. 호환성이 100 이상으로 설정 될 때마다 사용할 수 있어야합니다. 다음을 사용하여 서버 버전 및 호환성 수준을 확인할 수 있습니다.
SELECT SERVERPROPERTY('ProductVersion');
SELECT name, compatibility_level FROM sys.databases;
ID가 고유하고 음수가 아닌 것으로 가정 할 때 SQL Server 2005에서 작동하는 또 다른 방법이 있습니다. 필터 된 인덱스와 본질적으로 동일한 작업을 수행하기 위해 계산 된 열을 사용합니다.
alter table t
add column deleted_id (case when deleted = 0 then -1 else id end) persisted;
create unique index unq_t_passport_date_deleted_id on t(passport, date, deleted_id);
테이블이 있는데 삽입 된 데이터를 제한해야합니다. 이미 트리거를 사용하고 있지만 제약 조건이있는 동일한 작업을 수행 할 수 있는지 궁금합니다.
필드는 다음과 같습니다.
Id
Date
Passport
...
Deleted
제약 조건은 삭제 된 필드가 1 인 동안 n 개의 레코드를 허용해야하지만 삭제 된 필드가 0 인 경우 동일한 날짜와 여권이있는 행이 하나만 있어야합니다.
이 단계에서 작동해야합니다.
- Id = 1, Date = 2018-05-01, Passport = MPEUIE80, Deleted = 0 인 행 추가
- Id = 1 인 행을 삭제하므로 삭제 된 필드는 1이됩니다.
- Id = 2, Date = 2018-05-01, Passport = MPEUIE80, Deleted = 0 인 행 추가
- Id = 2 인 행을 삭제하므로 삭제 된 필드는 1이됩니다.
- Id = 3, Date = 2018-05-01, Passport = MPEUIE80, Deleted = 0 인 행 추가
- Id = 4, Date = 2018-05-01, Passport = MPEUIE80, Deleted = 0 인 행 추가
다섯 번째 단계까지는 모든 것이 작동하지만 마지막 단계에서 동일한 날짜 , 동일한 Passport 및 두 가지 행 ( Deleted = 0)을 처리 할 수 없기 때문에 오류가 발생해야합니다.
미리 감사드립니다.