Làm cách nào để chỉ định ràng buộc duy nhất cho nhiều cột trong MySQL?


865

Tôi có một cái bàn:

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

Bây giờ tôi muốn làm cho các cột người dùng, email, địa chỉ duy nhất (cùng nhau).

Làm thế nào để tôi làm điều này trong MySql?

Tất nhiên ví dụ chỉ là ... một ví dụ. Vì vậy, đừng lo lắng về ngữ nghĩa.

Câu trả lời:


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

31
Điều này có hoạt động đúng với mệnh đề ON DUPLICATE KEY của các câu lệnh INSERT không? Đó là, nếu tôi đang cố gắng chèn một hàng mâu thuẫn với các giá trị người dùng / email / địa chỉ của một hàng khác, liệu INSERT có thực hiện các hành động được chỉ định bởi mệnh đề ON DUPLICATE KEY không?
clizzin

6
Cách kết hợp ba sẽ là duy nhất? Hoặc tất cả ba cột riêng lẻ sẽ là duy nhất?
Gary Lindahl

95
Đối với những người sử dụng bàn làm việc của MySQL: hãy chuyển đến tab Chỉ mục và chọn ĐỘC ĐÁO làm loại của bạn. Đặt tên cho chỉ mục của bạn và kiểm tra các cột thích hợp trong phần "Cột chỉ mục"
Pakman

10
Giống như tôi, nếu có ai khác tìm thấy điều này từ các công cụ tìm kiếm ... và để trả lời câu hỏi của Clizzin về việc liệu ON DUPLICATE KEY có hoạt động với khóa tổng hợp hay không - tuy nhiên, nó sẽ yêu cầu một số điều chỉnh nhỏ cho cú pháp. xem stackoverflow.com/questions/9537710/ Mạnh
Joe

2
làm thế nào để làm cho nó hoạt động ngay cả với giá trị NULL. Nếu chúng tôi chèn Hai hàng giống nhau với giá trị NULL, thì điều này không hoạt động ...
Wasim A.

237

Tôi có một bảng 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`)
);

và UNIQUE KEY hoạt động đúng như mong đợi, nó cho phép nhiều hàng NULL của id_box_elements và id_router.

Tôi đang chạy MySQL 5.1.42, vì vậy có lẽ đã có một số cập nhật về vấn đề được thảo luận ở trên. May mắn là nó hoạt động và hy vọng nó sẽ giữ nguyên như vậy.


34
Tôi muốn đánh dấu câu trả lời này vì nó chỉ cho bạn cách tạo một bảng mới với một chỉ mục duy nhất trong đó câu trả lời của jonstjohn ở trên cho bạn biết cách cập nhật bảng hiện có. Họ làm điều tương tự mặc dù chỉ phụ thuộc vào việc bạn tạo bảng mới hay cập nhật bảng hiện có. :)
GazB

3
những gì với tất cả các backquote, họ phục vụ một số mục đích?
puk

8
Đó là đầu ra của Adminer (www.adminer.org), tự động chèn các backquote này, do đó không có vấn đề gì với việc va chạm các từ khóa mysql được sử dụng làm tên cột.
Frodik

50

Các chỉ mục duy nhất nhiều cột không hoạt động trong MySQL nếu bạn có một giá trị NULL liên tiếp vì MySQL coi NULL là một giá trị duy nhất và ít nhất hiện tại không có logic để làm việc xung quanh nó trong các chỉ mục nhiều cột. Vâng, hành vi này là điên rồ, bởi vì nó giới hạn rất nhiều ứng dụng hợp pháp của các chỉ mục nhiều cột, nhưng đó là ... Đó là một lỗi đã được đóng dấu "sẽ không sửa" trên MySQL theo dõi lỗi ...


11
Hai điểm cần làm rõ: 1) hành vi này không tuân thủ ENGINE BDBvà, 2) đây là hành vi được ghi lại , mặc dù, IMHO, không được ghi chép quá đủ cho thấy mức độ đáng ngạc nhiên / khó chịu của nó. Xem lỗi MySQL 25544 bug.mysql.com/orms.php?id=25544 để thảo luận.
hương

2
Cảm ơn vì NULL đã đề cập, giải quyết vấn đề tôi đang gặp phải ... Tôi nghĩ rằng tôi sẽ đi kiểm tra băm
Daniel Doezema

7
Đây không phải là một câu trả lời. Nó nên là một bình luận cho câu hỏi ban đầu.
Chuộc tội có giới hạn

Các tài liệu chính thức nói: Lưu ý rằng, kể từ MySQL 5.1, BDB không còn được hỗ trợ nữa.
George D.

2
Thông tin rất tốt, nhưng không phải là một câu trả lời. Chỉ liên quan đến ngoại vi cho câu hỏi.
billynoah

23

Bạn đã thử điều này?

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

Có gì Erick nói công trình chỉ tốt cho tôi: UNIQUE KEY thekey` ( user, email, address) `. Tôi đang sử dụng MYSQL phiên bản 5.5.24 Bạn có thể thiết lập điều này ngay cả trong PHPMYADMIN nếu bạn đang sử dụng nó. Tôi đang sử dụng phiên bản 3.5.1 của PMA.
WQC

Đã thử nó với MySql 5.6. Hoạt động từ lần thử đầu tiên. Cảm ơn Erick!
Lawrence

11

Điều này hoạt động cho phiên bản mysql 5.5.32

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

1
Nó dường như hoạt động mà không có dấu ngoặc đơn trên tên cột.
Pratik Singhal

7

MySql 5 hoặc cao hơn hoạt động như thế này (Tôi vừa thử nghiệm):

  • bạn có thể xác định các ràng buộc duy nhất liên quan đến các cột không thể. Giả sử bạn xác định một ràng buộc duy nhất (A, B) trong đó A không thể rỗng nhưng B là
  • khi đánh giá một ràng buộc như vậy, bạn có thể có (A, null) bao nhiêu lần bạn muốn (cùng giá trị A!)
  • bạn chỉ có thể có một cặp (A, không phải null B)

Ví dụ: PRODUCT_NAME, PRODUCT_VERSION 'ly', null 'ly', null 'rượu', 1

Bây giờ nếu bạn cố gắng chèn ('rượu' 1) một lần nữa, nó sẽ báo cáo vi phạm ràng buộc Hy vọng điều này sẽ giúp


cảm ơn vì đã giải thích. Tôi có duy nhất (A, B, C) và tôi không biết tại sao nó cho phép kết hợp null với cùng tùy chọn không null
Alexandru Topală

6

Bạn có thể thêm các chỉ mục duy nhất nhiều cột thông qua phpMyAdmin . (Tôi đã thử nghiệm trong phiên bản 4.0.4)

Điều hướng đến trang cấu trúc cho bảng mục tiêu của bạn. Thêm một chỉ mục duy nhất cho một trong các cột. Mở rộng danh sách Chỉ mục ở dưới cùng của trang cấu trúc để xem chỉ mục duy nhất bạn vừa thêm. Nhấp vào biểu tượng chỉnh sửa và trong hộp thoại sau, bạn có thể thêm các cột bổ sung vào chỉ mục duy nhất đó.


3

Tôi làm như thế này:

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

Quy ước của tôi cho một duy nhất index_nameTableName_Column1_Column2_Column3_uindex.


2

Để thêm chỉ mục duy nhất sau đây là bắt buộc:

1) tên_bảng
2 ) tên_bảng
3) mà bạn muốn thêm chỉ mục

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

Trong trường hợp của bạn, chúng tôi có thể tạo chỉ mục duy nhất như sau:

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

1

Nếu bạn muốn tránh trùng lặp trong tương lai. Tạo một cột khác nói id2.

UPDATE tablename SET id2 = id;

Bây giờ thêm duy nhất vào hai cột:

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

1

Nếu bạn đang tạo bảng trong mysql thì hãy sử dụng như sau:

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

Trước tiên hãy loại bỏ các bản sao hiện có

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;

Sau đó thêm các ràng buộc duy nhất

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

Xác nhận ràng buộc với

SHOW CREATE TABLE votes;

Lưu ý rằng người dùng, email, địa chỉ sẽ được coi là duy nhất nếu bất kỳ ai trong số họ có giá trị null trong đó.


0

Đối với PostgreSQL ... Nó không hoạt động với tôi với chỉ mục; nó đã cho tôi một lỗi, vì vậy tôi đã làm điều này:

alter table table_name
add unique(column_name_1,column_name_2);

PostgreSQL đưa ra chỉ mục duy nhất tên riêng của nó. Tôi đoán bạn có thể thay đổi tên của chỉ mục trong các tùy chọn cho bảng, nếu cần phải thay đổi ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.