2010-09-26 38 views
41

Tôi có một bảng mysql với các cột sau:Sử dụng nhiều cột như định danh duy nhất cho mysql

group_id 
game_id 
user_id 
message 
last_update 

tôi muốn làm cho nó để không có hai hàng có thể tồn tại trong đó giá trị của GROUP_ID cho hàng x bằng với giá trị của group_id cho hàng y VÀ giá trị của user_id cho hàng x cũng bằng với giá trị của user_id cho hàng y.

Vì vậy, ví dụ, giả sử tôi chèn các giá trị sau đây sau đây:

group_id = 783 
game_id = 34 
user_id = 29237 
message = none 
last_update = 11233452 

Các dữ liệu trên, thậm chí nếu một truy vấn mysql cố gắng chèn nó, không nên tạo ra một hàng mới nếu hàng đã tồn tại với cùng một nhóm group_id và user_id. Có cách nào để làm việc này không? Về cơ bản, tôi đang cố gắng để có được hai cột để làm việc cùng nhau loại giống như một chỉ số duy nhất.

+0

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

+0

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

Trả lời

82

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`) 
+1

Cảm ơn bạn rất nhiều. – user396404

+0

Có thể làm cho nó để họ chỉ làm việc với nhau như là một khóa chính/duy nhất chỉ khi group_id! = '0'? – user396404

+0

Xem câu trả lời đã chỉnh sửa – Hammerite

0

cũng cho điều này bạn có thể tạo khóa tổng hợp của group_id và user_id bằng cách sử dụng bất kỳ trình soạn thảo mysql nào như phpmyadmin hoặc sqlyog và đánh dấu nó là chỉ mục duy nhất.

Các vấn đề liên quan