MySQL의 고유 제약 조건 및 NULL에 대한 자세한 설명

黄舟
풀어 주다: 2017-05-21 10:10:23
원래의
1273명이 탐색했습니다.

여기에 기록된 내용은 오래 전에 발생한 버그로, 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿