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_name은 TableName_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.