MySQL에서 여러 열에 대한 고유 제약 조건을 어떻게 지정합니까?


865

나는 테이블이있다 :

table votes (
    id,
    user,
    email,
    address,
    primary key(id),
);

이제 열을 사용자, 이메일, 주소를 고유 하게 만들려고합니다 .

MySql에서 어떻게해야합니까?

물론 예는 단지 예일뿐입니다. 따라서 의미에 대해 걱정하지 마십시오.

답변:


1436
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);

31
INSERT 문의 ON DUPLICATE KEY 절에서 제대로 작동합니까? 즉, 다른 행의 사용자 / 이메일 / 주소 값과 충돌하는 행을 삽입하려고하면 INSERT가 대신 ON DUPLICATE KEY 절에 지정된 조치를 수행합니까?
clizzin

6
그런 식으로 3의 조합이 독특할까요? 아니면 모든 개별 세 열이 고유합니까?
Gary Lindahl

95
MySQL 워크 벤치를 사용하는 사람들의 경우 : 색인 탭으로 이동하여 유형으로 고유를 선택하십시오. 색인의 이름을 지정하고 "색인 열"섹션에서 해당 열을 확인하십시오.
Pakman

10
나처럼 다른 누군가가 검색 엔진에서 이것을 발견하면 ON DUPLICATE KEY가 복합 키와 함께 작동하는지에 대한 Clizzin의 질문에 대답하려면 절대적으로 그래야하지만 구문에 약간의 조정이 필요합니다. 참조 stackoverflow.com/questions/9537710/...

2
NULL 값으로도 작동하게하는 방법. NULL 값으로 두 개의 동일한 행을 삽입하면 작동하지 않습니다 ...
Wasim A.

237

MySQL 테이블이 있습니다.

CREATE TABLE `content_html` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_box_elements` int(11) DEFAULT NULL,
  `id_router` int(11) DEFAULT NULL,
  `content` mediumtext COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_box_elements` (`id_box_elements`,`id_router`)
);

UNIQUE KEY는 예상대로 작동하며 id_box_elements 및 id_router의 여러 NULL 행을 허용합니다.

MySQL 5.1.42를 실행 중이므로 위에서 설명한 문제에 대한 업데이트가있을 수 있습니다. 다행히도 작동하고 희망적으로 유지됩니다.


34
위의 jonstjohn의 답변이 기존 테이블을 업데이트하는 방법을 알려주는 고유 인덱스로 새 테이블을 만드는 방법을 보여 주므로이 답변을 표시하고 싶습니다. 새 테이블을 만들거나 기존 테이블을 업데이트하는지 여부에 따라 다르지만 동일한 작업을 수행합니다. :)
GazB

3
모든 역 따옴표는 무엇입니까, 그들은 어떤 목적을 수행합니까?
puk

8
이 인용 부호를 자동으로 삽입하는 Adminer (www.adminer.org)에서 출력되므로 열 이름으로 사용되는 mysql 키워드를 충돌시키는 데 아무런 문제가 없습니다.
Frodik

50

MySQL이 NULL을 고유 값으로 취급하고 적어도 현재 다중 열 인덱스에서이를 해결하기위한 논리가 없기 때문에 행에 NULL 값이 있으면 다중 열 고유 인덱스가 MySQL에서 작동하지 않습니다. 예, 여러 열 인덱스의 합법적 인 응용 프로그램을 많이 제한하기 때문에 동작이 미친 듯하지만 실제로는 ... MySQL에서 "고정하지 않을 것"으로 찍힌 버그입니다. 버그 추적 ...


11
설명의 두 가지 요점 : 1)이 행동은 옹호하지 않으며 ENGINE BDB, 2) 이것은 IMHO가 얼마나 놀랍고 불쾌 할 수 있는지에 대해 충분히 문서화되지는 않았지만 문서화 된 행동입니다. 자세한 내용은 MySQL 버그 25544 bugs.mysql.com/bug.php?id=25544 를 참조하십시오 .
순례자

2
최대 NULL 헤드 주셔서 감사합니다, 내가 가지고 있던 문제를 해결 ... 내가 해시 검사와 함께 갈 거라 생각
다니엘 Doezema에게

7
이것은 답이 아닙니다. 원래 질문에 대한 의견이어야합니다.
제한 속죄

공식 문서 : MySQL 5.1부터 BDB는 더 이상 지원되지 않습니다.
George D.

2
아주 좋은 정보이지만 대답은 아닙니다. 질문과 주변 적으로 만 관련이 있습니다.
billynoah

23

이것을 시도 했습니까?

UNIQUE KEY `thekey` (`user`,`email`,`address`)

무엇 에릭이 나를 위해 잘 작동했다 : UNIQUE KEY thekey` ( user, email, address)`. MYSQL 버전 5.5.24를 사용하고 있습니다. PHPMYADMIN에서도 사용할 수 있습니다. PMA 3.5.1 버전을 사용하고 있습니다.
WQC

MySql 5.6으로 시도했습니다. 첫 번째 시도에서 작동합니다. 고마워 에릭!
로렌스

11

이것은 mysql 버전 5.5.32에서 작동합니다.

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);

1
열 이름에 작은 따옴표없이 작동하는 것 같습니다.
Pratik Singhal

7

MySql 5 이상은 다음과 같이 작동합니다 (방금 테스트했습니다).

  • 널 입력 가능 컬럼과 관련된 고유 제한 조건을 정의 할 수 있습니다. A가 널 입력 가능하지 않지만 B가
  • 그러한 제약 조건을 평가할 때 원하는 횟수만큼 (A, null)을 가질 수 있습니다 (같은 A 값!)
  • 하나의 (B 형이 아닌 A) 쌍만 가질 수 있습니다

예 : PRODUCT_NAME, PRODUCT_VERSION 'glass', null 'glass', null 'wine', 1

이제 ( 'wine'1)을 다시 삽입하려고하면 제약 조건 위반이보고됩니다.


설명해 주셔서 감사합니다. 나는 독특한 (A, B, C)가 있으며이 같은 null 이외의 옵션을 널 (null)의 조합을 허용하는 이유는 몰랐다
Alexandru Topală을

6

phpMyAdmin을 통해 여러 열의 고유 인덱스를 추가 할 수 있습니다 . (버전 4.0.4에서 테스트)

대상 테이블 의 구조 페이지로 이동 하십시오. 열 중 하나에 고유 색인을 추가하십시오. 구조 페이지 맨 아래에 있는 색인 목록을 확장하여 방금 추가 한 고유 색인을보십시오. 편집 아이콘을 클릭하면 다음 대화 상자에서 해당 고유 색인에 열을 추가 할 수 있습니다.


3

나는 이렇게한다 :

CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);

고유 한 내 컨벤션 index_nameTableName_Column1_Column2_Column3_uindex입니다.


2

고유 색인을 추가하려면 다음이 필요합니다.

1) table_name
2) index_name
3) 인덱스를 추가하려는 열

ALTER TABLE  `tablename` 
ADD UNIQUE index-name
(`column1` ,`column2`,`column3`,...,`columnN`);

귀하의 경우 다음과 같이 고유 색인을 만들 수 있습니다.

ALTER TABLE `votes`ADD 
UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);

1

나중에 중복을 피하려면 id2라는 다른 열을 만듭니다.

UPDATE tablename SET id2 = id;

이제 두 개의 열에 고유 한 항목을 추가하십시오.

alter table tablename add unique index(columnname, id2);

1

mysql에서 테이블을 작성하는 경우 다음을 사용하십시오.

create table package_template_mapping (
mapping_id  int(10) not null auto_increment  ,
template_id int(10) NOT NULL ,
package_id  int(10) NOT NULL ,
remark      varchar(100),
primary key (mapping_id) ,
UNIQUE KEY template_fun_id (template_id , package_id)
);

0

먼저 기존 복제본을 제거하십시오.

delete a from votes as a, votes as b where a.id < b.id 
and a.user <=> b.user and a.email <=> b.email 
and a.address <=> b.address;

그런 다음 고유 제한 조건을 추가하십시오.

ALTER TABLE votes ADD UNIQUE unique_index(user, email, address);

로 구속 조건을 확인하십시오

SHOW CREATE TABLE votes;

사용자, 이메일, 주소 중 하나에 null 값이 있으면 고유 한 것으로 간주됩니다.


0

PostgreSQL의 경우 ... 색인으로 작동하지 않았습니다. 그것은 나에게 오류를 줬다. 그래서 나는 이것을했다 :

alter table table_name
add unique(column_name_1,column_name_2);

PostgreSQL은 고유 인덱스에 자체 이름을 부여했습니다. 변경 해야하는 경우 테이블 옵션에서 색인 이름을 변경할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.