답변:
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
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를 실행 중이므로 위에서 설명한 문제에 대한 업데이트가있을 수 있습니다. 다행히도 작동하고 희망적으로 유지됩니다.
MySQL이 NULL을 고유 값으로 취급하고 적어도 현재 다중 열 인덱스에서이를 해결하기위한 논리가 없기 때문에 행에 NULL 값이 있으면 다중 열 고유 인덱스가 MySQL에서 작동하지 않습니다. 예, 여러 열 인덱스의 합법적 인 응용 프로그램을 많이 제한하기 때문에 동작이 미친 듯하지만 실제로는 ... MySQL에서 "고정하지 않을 것"으로 찍힌 버그입니다. 버그 추적 ...
ENGINE BDB
, 2) 이것은 IMHO가 얼마나 놀랍고 불쾌 할 수 있는지에 대해 충분히 문서화되지는 않았지만 문서화 된 행동입니다. 자세한 내용은 MySQL 버그 25544 bugs.mysql.com/bug.php?id=25544 를 참조하십시오 .
이것은 mysql 버전 5.5.32에서 작동합니다.
ALTER TABLE `tablename` ADD UNIQUE (`column1` ,`column2`);
MySql 5 이상은 다음과 같이 작동합니다 (방금 테스트했습니다).
예 : PRODUCT_NAME, PRODUCT_VERSION 'glass', null 'glass', null 'wine', 1
이제 ( 'wine'1)을 다시 삽입하려고하면 제약 조건 위반이보고됩니다.
먼저 기존 복제본을 제거하십시오.
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 값이 있으면 고유 한 것으로 간주됩니다.
PostgreSQL의 경우 ... 색인으로 작동하지 않았습니다. 그것은 나에게 오류를 줬다. 그래서 나는 이것을했다 :
alter table table_name
add unique(column_name_1,column_name_2);
PostgreSQL은 고유 인덱스에 자체 이름을 부여했습니다. 변경 해야하는 경우 테이블 옵션에서 색인 이름을 변경할 수 있습니다.