>데이터 베이스 >MySQL 튜토리얼 >MySQL의 NULL에 대한 자세한 설명

MySQL의 NULL에 대한 자세한 설명

巴扎黑
巴扎黑원래의
2017-05-21 18:40:521629검색

여기에 기록된 것은 오래 전에 발생한 버그입니다. 주로 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이 존재할 수 있습니다. . . .

그래서 우리는 고칠 수 밖에 없습니다. . . 해결책은 매우 간단하고 간단합니다. 온라인 데이터를 새로 고치고 "1970-01-01 08:00:00"을 기본값으로 설정한 다음 해당 열을 NULL을 허용하지 않도록 변경하면 됩니다.

많은 사람들이 MySQL 공식 웹사이트에서 이 문제에 대해 논의했습니다. 어떤 사람들은 이것이 MySQL의 버그라고 생각하는 반면 다른 사람들은 그것이 기능이라고 생각합니다.

MySQL 버그: #8173: 고유 인덱스는 null 값이 있는 중복을 허용합니다

위 내용은 MySQL의 NULL에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.