NULL

2011-07-27 13 views
4
나는이 같은 일을 내 테이블을 변경 한
ALTER TABLE admins ADD CONSTRAINT uc_EmailandDeleted_at UNIQUE (email,deleted_at); 

지원하지 않는 MySQL의 독특한 여러 :NULL

ID EMAIL     DELETED_AT 
1. [email protected]   NULL    <- accept 
2. [email protected]   NULL    <- reject because of uniqueness. 

을하지만 원하는대로 그것이 작동하지 않습니다. 내가 두 개의 동일한 날짜를

deleted_at
에게 주었다면 예상대로 오류가 발생하고 있습니다. 그러나 NULL 값은 아닙니다. 어떤 생각?

NB : acts_as_paranoid를 사용하기 때문에 deleted_at 열의 동작을 변경할 수 없습니다. 그래서 NULL 또는 날짜가되도록 deleted_at 필드를 유지해야합니다. the documentation에서

+0

나는 InnoDB를 사용하고있다. – shajin

답변

4

:

고유 인덱스는 제약 조건을 생성하는 인덱스 의 모든 값은 구별되어야합니다 있도록. 키 값이 기존 행과 일치하는 새 행을 추가하려고하면 오류가 발생합니다. 이 제약 조건은 BDB 스토리지 엔진을 제외하고 NULL 값에 을 적용하지 않습니다. 다른 엔진의 경우 UNIQUE 인덱스는 NULL을 포함 할 수있는 열에 대해 여러 개의 NULL 값을 허용합니다.

위의 내용은 MySQL 5.0에서 발췌 한 것입니다. MySQL은 5.1.12에서 BDB 스토리지 엔진을 삭제했습니다. 최신 documentation에서 이제 :

모든 엔진의 경우, 고유 인덱스는 NULL을 포함 할 수있는 컬럼에 대해 여러 NULL 값을 허용합니다. UNIQUE 인덱스의 컬럼에 대한 접 두부 값을 지정할 경우, 컬럼 값은 접 두부 내에서 고유해야합니다.

+0

그래서이 작업을하기 위해 deleted_at의 동작을 부울 값으로 변경하고 싶다. rite ?? 어떤 방식 으로든 감사합니다 .. – shajin

+1

FYI, 5.5에서 변경됨 "모든 엔진에서 UNIQUE 색인은 NULL을 포함 할 수있는 열에 대해 여러 개의 NULL 값을 허용합니다." – gbn