이 기사에서는 MySQL의 고유 제약 조건 및 NULL에 대한 관련 정보를 주로 소개합니다. 기사의 소개는 매우 자세하며 필요한 모든 사람을 위한 특정 참조 및 학습 가치가 있습니다. 그것이 모두에게 도움이 되기를 바랍니다.
머리말
전에 만든 요구사항인데 간단히 설명하면 다른 그룹의 MQ 메시지를 수락한 다음 데이터베이스에 레코드를 삽입하는 것입니다. 반복적인 메시지 전송과 다수의 중복 레코드 삽입을 방지하기 위해 테이블의 여러 컬럼에 고유 인덱스를 추가했습니다.
CREATE UNIQUE INDEX IDX_UN_LOAN_PLAN_APP ON testTable (A, B, C);
이때 A, B, C 세 열은 NULL 값을 허용하지 않으며 고유성 제약 조건도 작동합니다.
나중에 요구 사항 변경으로 인해 이전 고유성 제약 조건이 수정되고 추가 열이 추가되었습니다. (이유에 대해서는 자세히 설명하지 않겠습니다.)
ALTER TABLE testTable DROP INDEX IDX_UN_LOAN_PLAN_APP, ADD UNIQUE KEY `IDX_UN_LOAN_PLAN_APP` (A, B, C, D);
새로 추가된 D는 datetime 유형으로 NULL을 허용하며 기본값은 NULL입니다. 기본값이 NULL인 이유는 모든 레코드에 이 시간이 없기 때문입니다. 강제로 Magic Value(예: '1970-01-01 08:00:00')를 기본값으로 설정하면 이상하게 보입니다.
블루 퀸. . . 문제가 발생했습니다. D를 추가한 후에는 고유성 제약 조건이 기본적으로 유효하지 않습니다.
Insert into testTable (A,B,C,D) VALUES (1,2,3,NULL); --- OK Insert into testTable (A,B,C,D) VALUES (1,2,3,NULL); --- OK Insert into testTable (A,B,C,D) VALUES (1,2,3,NULL); --- OK
위의 세 가지 SQL은 모두 성공적으로 실행될 수 있으며 데이터베이스에 동일한 레코드가 여러 개 있을 것입니다. 이전 아이디어에 따르면 마지막 두 개의 SQL을 실행할 때 '중복 키' 예외가 발생해야 합니다.
나중에 확인해 보니 MySQL 공식 문서에 이렇게 명시되어 있는 것을 알 수 있었습니다. 고유 인덱스를 사용하면 여러 개의 NULL 값이 존재할 수 있습니다.
A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. For all engines, a UNIQUE index allows multiple NULL values for columns that can contain NULL.
어떤 유형을 사용하더라도 아래 표에서도 알 수 있습니다. 스토리지 엔진에서는 고유 키를 생성할 때 여러 개의 NULL이 존재할 수 있습니다. . . .
잘 생각해 보면 실제로는 상당히 합리적입니다. 결국 NULL은 MySQL에서 "알 수 없음"을 나타내는 것으로 간주됩니다. SQL에서는 임의의 값과 NULL을 비교하면 TRUE 대신 NULL이 반환되고, NULL과 NULL을 비교해도 NULL이 반환됩니다.
그래서 우리는 그것을 고칠 수 밖에 없습니다. . . 해결책은 매우 간단하고 간단합니다. 온라인 데이터를 새로 고치고 "1970-01-01 08:00:00"을 기본값으로 설정한 다음 해당 열을 NULL을 허용하지 않도록 변경하면 됩니다.
많은 사람들이 MySQL 공식 웹사이트에서 이 문제에 대해 논의했습니다. 어떤 사람들은 이것이 MySQL의 버그라고 생각하고 다른 사람들은 그것이 기능이라고 생각합니다.
MySQL 버그: #8173: 고유 인덱스는 null 값이 있는 중복을 허용합니다.
관련 권장 사항:
MySQL의 제약 조건, 다중 테이블 쿼리 및 하위 쿼리에 대한 자세한 예
의 유형 제약에 대한 코드 아이디어위 내용은 MySQL의 고유 제약 조건 및 NULL 인스턴스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!