Có, MySQL cung cấp khả năng thực hiện việc này.
ALTER TABLE MyTable
ADD UNIQUE KEY `my_unique_key` (`group_id`, `user_id`)
Tôi không biết bạn đang sử dụng bảng này, nhưng có vẻ như khóa duy nhất này có thể là ứng cử viên mạnh cho khóa chính của bảng. Khoá chính cũng tự động là một khóa duy nhất. Nếu bạn quyết định để làm cho nó khóa chính, sau đó làm như sau thay vì:
ALTER TABLE MyTable
ADD PRIMARY KEY (`group_id`, `user_id`)
(. Nếu bạn nhận được một thông báo lỗi rằng đã có một khóa chính, sau đó phát hành ALTER TABLE MyTable DROP PRIMARY KEY
và sau đó lặp lại các lệnh trên)
Edit: để đối phó với người dùng bình luận
Bạn không thể có nhiều hàng với giống NULL
giá trị phi cho các cột bao phủ bởi các khóa duy nhất. Vì vậy, bạn không thể có hai hàng ví dụ như group_id = 0 AND user_id = 5
. 0 là một giá trị. Nhưng nếu bạn tạo một hoặc cả hai cột có thể vô hiệu hóa, bạn có thể có nhiều hàng giống hệt với vị trí của NULL
s. Vì vậy, bạn có thể có hai (hoặc nhiều) hàng nơi group_id IS NULL AND user_id = 1234
.
Proviso: Điều trên là đúng đối với cả hai công cụ lưu trữ MySQL thường được sử dụng (MyISAM và InnoDB). MySQL không có các công cụ lưu trữ trong đó NULL
được coi là một giá trị duy nhất, nhưng có thể bạn không sử dụng chúng.
Nếu bạn đặt một hoặc cả hai cột rỗng, thì khóa duy nhất của bạn không thể là khóa chính - khóa chính phải nằm trên các cột là NOT NULL
.
Giả sử bạn đã đặt khóa này làm khóa chính của mình và bây giờ bạn muốn cho phép NULL
trong cột group_id
. Tôi không biết những gì datatype group_id
là vào lúc này; Tôi sẽ giả sử nó hiện là INT UNSIGNED NOT NULL
, nhưng bạn sẽ phải sửa đổi bên dưới nếu nó không phải như vậy. Bạn sẽ không còn có thể sử dụng khóa này làm khóa chính của mình nữa. Đây là lệnh bạn có thể chạy để thực hiện các thay đổi mong muốn:
ALTER TABLE MyTable
DROP PRIMARY KEY,
MODIFY group_id INT UNSIGNED,
ADD UNIQUE KEY `my_unique_key_with_nulls` (`group_id`, `user`)
Có lý do gì khiến group_id và user_id không phải là khóa chính cho bảng này không? – Gus
Chúng được đặt làm chỉ mục, nhưng không được đặt thành chính sẽ tạo sự khác biệt khi cố hoàn thành tác vụ? Nếu vậy, tôi có thể làm cho chúng chính. – user396404