Có, MySQL cung cấp khả năng thực hiện điều 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 để làm gì, nhưng có vẻ như khóa duy nhất này có thể là một ứng cử viên sáng giá cho khóa chính của bảng. Khóa chính cũng tự động là một khóa duy nhất. Nếu bạn quyết định đặt nó làm khóa chính, hãy làm như sau:
ALTER TABLE MyTable
ADD PRIMARY KEY (`group_id`, `user_id`)
(Nếu bạn nhận được thông báo lỗi rằng đã có khóa chính, hãy phát hành ALTER TABLE MyTable DROP PRIMARY KEY
và sau đó lặp lại lệnh trên.)
Chỉnh sửa: Để trả lời nhận xét của người dùng
Bạn không thể có nhiều hàng với các dòng không phải NULL
giống hệt nhau giá trị cho các cột được bao phủ bởi khóa duy nhất. Vì vậy, bạn không thể có hai hàng trong đó group_id = 0 AND user_id = 5
, Ví dụ. 0 là một giá trị. Nhưng nếu bạn đặt một hoặc cả hai cột là vô hiệu, bạn có thể có nhiều hàng giống hệt nhau với vị trí của NULL
S. Vì vậy, bạn có thể có hai (hoặc nhiều) hàng trong đó group_id IS NULL AND user_id = 1234
.
Proviso:Điều trên đúng với cả hai công cụ lưu trữ MySQL thường được sử dụng (MyISAM và InnoDB). MySQL 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 đang không sử dụng chúng.
Nếu bạn đặt một hoặc cả hai cột là vô hiệu, 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 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 group_id
cột. Tôi không biết loại dữ liệu nào group_id
là vào lúc này; Tôi sẽ cho rằng nó hiện tại INT UNSIGNED NOT NULL
, nhưng bạn sẽ phải sửa đổi nội dung bên dưới nếu nó không phải là điều này. Bạn sẽ không thể sử dụng khóa này làm khóa chính của mình nữa. Đây là một 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`)