MySQL은 고유 제약 조건에서 null 값을 무시합니까?


답변:


423

예, MySQL은 고유 제약 조건이있는 열에서 여러 NULL을 허용합니다.

CREATE TABLE table1 (x INT NULL UNIQUE);
INSERT table1 VALUES (1);
INSERT table1 VALUES (1);   -- Duplicate entry '1' for key 'x'
INSERT table1 VALUES (NULL);
INSERT table1 VALUES (NULL);
SELECT * FROM table1;

결과:

x
NULL
NULL
1

모든 데이터베이스에 적용되는 것은 아닙니다. 예를 들어 SQL Server 2005 및 이전 버전은 고유 제약 조건이있는 열에 단일 NULL 값만 허용합니다.


37
mysql에서 어떻게 적용되는지에 대한 훌륭한 의견이지만 반드시 일반적인 것은 아닙니다.
user2910265

11
SQLite FAQ 에 따르면 동작 MySQL, PostgreSQL, SQLite, Oracle 및 Firebird에서 동일합니다.
Amir Ali Akbari

4
답변을 업데이트하십시오. SQLServer에이 2008+ 절대적 수 있습니다, 당신은 단순히 2017 년 ... WHERE 절을 추가해야합니다, 아무도 어쨌든 2008보다 이전 버전에 없어야합니다 ... stackoverflow.com/questions/767657/...
마티유 터콧

이 작은 기능은 데이터베이스에 새 열을 추가하거나 매우 오래된 응용 프로그램에서 MySQL을 업그레이드 할 필요가없는 해답을 찾기가 매우 어렵습니다. COALESCE를 사용할 수있는 Postgres와 같은 솔루션을 실제로 찾고 있었지만 대답은 항상 버그가 아닌 것처럼 보입니다. WHERE column IS NOT NULL내 MySQL 버전에서 지원되지 않으므로 실패 하지 않는 것 같습니다. 내가 어디서 볼 수 있는지 아는 사람 있나요?
newdark-it

1
참고 : 더 많은 열이있는 고유 인덱스도 작동합니다. 따라서 a, b 및 c 열을 고유하게 만들려면 테이블에 null, b, c를 사용하여 이중 행을 가질 수 있습니다.
Mihai Crăiță

111

에서 워드 프로세서 :

"UNIQUE 인덱스는 NULL을 포함 할 수있는 열에 대해 여러 개의 NULL 값을 허용합니다"

이것은 BDB 이외의 모든 엔진에 적용됩니다 .


3
BDB는 더 이상 현재 mysql 버전에서 사용할 수 없습니다 (5.1.12로 시작).
Alim Özdemir 2016 년

1
내 테스트는 Java Derby 데이터베이스 v10.13.1.1을 보여줍니다. 마찬가지로 고유 인덱스가있는 열에 하나의 null 만 허용합니다.
chrisinmtown

7

저자가 원래 이것이 중복 값을 허용하는지 여부를 묻는 지 또는 여기에 " NULL사용하는 동안 중복 값 을 허용하는 방법 UNIQUE?"을 암시하는 질문이 있는지 확실하지 않습니다. 또는 "하나의 UNIQUE NULL값만 허용하는 방법 "

질문에 이미 답변되었으므로 인덱스 NULL를 사용하는 동안 중복 값을 가질 수 있습니다 UNIQUE.

"하나의 UNIQUE NULL가치 를 허용하는 방법"을 검색하는 동안이 답변을 발견했습니다 . 같은 일을 하면서이 질문에 걸려 넘어 질 수있는 다른 사람들을 위해, 나머지 대답은 당신을위한 것입니다 ...

MySQL에서는 하나의 UNIQUE NULL값을 가질 수 없지만 UNIQUE빈 문자열 값을 삽입하여 하나의 빈 값을 가질 수 있습니다 .

경고 : 숫자 및 문자열 이외의 유형은 기본값이 0이거나 다른 기본값 일 수 있습니다.


1
구속 조건은 색인과 관련이 없습니다. 실제로, 다른 행이 없다는 사실에도 불구하고 NULL 값을 가진 단일 행을 가질 수도 없습니다.
Pijusn

1
@Pijusn "제약은 인덱스와 관련이 없습니다"는 무슨 뜻입니까? 또한 두 번째 문장에 대해서는 NULL 값을 가진 행을 가질 수 있다고 말한 적이 없으므로 게시물 시작 부분에 언급 한 이유는 이것이 null 값을 사용하지 않는 경우에만 해결책이라는 것입니다.
bluegman991

내가 의미하는 것은 새로운 요소를 추가하는 것이 UNIQUE제약 때문에가 아니라 제약 때문에 실패한다는 것입니다 NOT NULL. 나는이 답변이 질문과 관련이 없다고 생각합니다. 왜냐하면 질문은 UNIQUE제약 의 동작에 관한 것입니다 .
Pijusn

@Pijusn 내가 당신을 얻었다. 당신 말이 맞아요 질문을 잘못 읽었습니다. 그러나 고유 한 "아무것도"값을 갖는 방법을 찾으려고했지만 실수로 null을 허용하는 것처럼이 질문을 우연히 발견 한 사용자에게는 답이 여전히 유용 할 수 있다고 생각합니다.
bluegman991

1
이 답변이 유용하다는 것을 알았습니다. 그러나 여기에도 답변되어 있습니다 . 이 게시물은 내 Google 검색의 첫 번째 결과이지만이 답변과 관련 질문은 내가 찾던 것입니다.
kingledion

5

널 입력 가능 고유 제한 조건을 피하십시오. 열을 항상 새 테이블에 넣고 널이 아닌 고유 한 값으로 만든 다음 값이있을 때만 해당 테이블을 채울 수 있습니다. 이렇게하면 열에 대한 모든 키 종속성이 올바르게 적용되고 널 (null)로 인해 발생할 수있는 문제점을 피할 수 있습니다.


6
예, 그러나 제안하는 것은 거의 mysql이 이미 배후에서 수행하는 것입니다. 이 기능이 내장되어있는 이유는 무엇입니까?
ProfileTwist

2
유효한 SQL이 아니기 때문입니다. 이 팁은 데이터베이스에 구애받지 않는 디자인을 원하는 (또는 필요로하는) ​​모든 사람에게 유용 할 것이라고 생각합니다.
Arsen7

@ Arsen7 여러 비즈니스를 보유하고있는 경우 (각각 클라이언트가 여러 명인 경우) 고객의 이메일 주소와 함께 모든 비즈니스를 하나의 파일로 저장합니다. 따라서 다른 비즈니스에 동일한 클라이언트가있을 수 있으므로 email_address를 고유하게 만들 수 없습니다. 따라서 business_id와 email_address의 복합 고유 인덱스를 만들어야합니다. 설명대로 새 테이블에 이것을 넣을 수 있습니까?
Gerhard Liebenberg

4
"이메일"열이 고유하거나 null이어야하는 경우가 있습니다. 귀하의 조언을 따르려면 단일 "이메일"열이있는 새 테이블을 만들어야합니다. 이 MySQL 특정 동작에 의존하는 것이 훨씬 쉽고 결과는 동일합니다. 고객은 이메일을 새 테이블에 저장할지 여부를 신경 쓰지 않습니다. 또한 데이터베이스에 구애받지 않는 디자인은 종종 과대 평가됩니다. 많은 프로젝트의 경우 한 DB에서 다른 DB로 쉽게 전환 할 수 없으며 아마도 그렇게하지 않을 수도 있습니다.
conradkleinespel

1
@djmj는 확실하지만 기능 의존성은 대부분의 사람들에게 중요하며 nullable 고유 제약 조건 버전은 BCNF 버전과 동일한 종속성을 강제하지 않습니다. 따라서 어느 옵션이 다소 실용적인 지에 따라 어떤 종속성이 중요한지에 따라 달라질 수 있습니다. 따라서 새 테이블을 만드는 것이 좋습니다.
nvogel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.