Làm cách nào để sử dụng khóa Unique thông qua kết hợp các trường của bảng?


9

Hãy xem sqlfiddle sau: http://sqlfiddle.com/#!2/dacb5/1

CREATE TABLE contacts 
    (
     id int auto_increment primary key, 
     name varchar(20), 
     network_id int,
     network_contact_id int
    );

INSERT INTO contacts
(name, network_id, network_contact_id)
VALUES
('John', 4, 10),
('Alex', 4, 11),
('Bob', 4, 12),
('Jeff', 4, 45),
('Bill', 7, 11),
('Walter', 7, 45),
('Jessie', 7, 360) ;

Tôi có một bảng liên lạc cơ bản. Các trường network_idnetwork_contact_idchứa các số id liên kết đến các bảng khác.

Tôi muốn có thể chạy INSERT IGNOREcác truy vấn vào bảng này, nhưng tôi muốn sử dụng kết hợp network_idnetwork_contact_idlàm khóa duy nhất để đối chiếu.

Vì vậy, ví dụ, nếu tôi cố gắng chèn một liên hệ có network_id = 4network_contact_id = 12, INSERT IGNOREtruy vấn sẽ thấy mục đó đã tồn tại và bỏ qua bất kỳ lỗi nào được đưa ra.

Về cơ bản, network_idkhông phải là duy nhất. network_contact_idkhông phải là duy nhất. Nhưng sự kết hợp của hai là độc nhất. Làm thế nào để tôi thiết lập điều này? Tôi có phải có một trường khác là các giá trị được nối của hai trường khác không? Hoặc có cách nào để thiết lập các phím cho bảng này để nó sẽ làm những gì tôi cần?

Câu trả lời:


9

Bạn đã thử chưa

CREATE TABLE contacts (
 id int auto_increment primary key, 
 name varchar(20), 
 network_id int,
 network_contact_id int, 
 UNIQUE KEY (`network_id`, `network_contact_id`)
);

2
OMG Cả câu trả lời của bạn và @ ypercube đều có dấu thời gian giống hệt nhau. +1 cho cả hai bạn.
RolandoMySQLDBA

1
Có bất kỳ lý do để giữ idtrường làm khóa chính nếu unique keyđiều này bây giờ được đặt không?
Jake Wilson

1
Đây là một câu hỏi liên quan về vấn đề giữ trường id.
Derek Downey

1
@Rolando: Thật ra DTest đã nhanh hơn 1 giây :)
ypercubeᵀᴹ

6

Thay đổi định nghĩa của bảng bằng cách thêm một UNIQUE KEYràng buộc về sự kết hợp của hai cột:

CREATE TABLE contacts 
    (
     id int auto_increment primary key, 
     name varchar(20), 
     network_id int,
     network_contact_id int,
     CONSTRAINT network_id_contact_id_UNIQUE
       UNIQUE KEY (network_id, network_contact_id)
    );

Bạn cũng nên kiểm tra câu trả lời này bởi Bill Karwin về sự khác biệt giữa INSERT IGNORE, REPLACEINSERT ... ON DUPLICATE KEY UPDATE


1
Tại sao định nghĩa của bạn có ràng buộc trong đó khi DTest không? Sự khác biệt là gì?
Jake Wilson

4
Điều này chỉ cung cấp một tên cho các ràng buộc. Nếu tôi nhớ rõ, với câu trả lời DTest, ràng buộc sẽ được tự động đặt tên bởi MySQL.
ypercubeᵀᴹ
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.