2009-06-04 57 views
40

Tôi có một bảng có khóa chính bao gồm hai cột (product_id, attribute_id). Tôi có một bảng khác cần tham khảo bảng này. Làm thế nào tôi có thể làm cho một khóa nước ngoài trong bảng khác để liên kết nó với một hàng trong bảng với hai khóa chính?Khóa ngoài nhiều cột trong MySQL?

Trả lời

67

Something như thế này phải làm điều đó:

CREATE TABLE MyReferencingTable AS (
    [COLUMN DEFINITIONS] 
    refcol1 INT NOT NULL, 
    rofcol2 INT NOT NULL, 
    CONSTRAINT fk_mrt_ot FOREIGN KEY (refcol1, refcol2) 
         REFERENCES OtherTable(col1, col2) 
) ENGINE=InnoDB; 
  • MySQL đòi hỏi các phím nước ngoài được lập chỉ mục, vì thế mà chỉ mục trên các cột tham khảo
  • Sử dụng cú pháp hạn chế cho phép bạn đặt tên cho một hạn chế , làm cho nó dễ dàng hơn để thay đổi và thả vào một thời gian sau đó nếu cần thiết.
  • InnoDB thi hành các khóa ngoại, MyISAM thì không. (Cú pháp được phân tách nhưng bỏ qua)
+1

FWIW, MyISAM phân tích cú pháp và bỏ qua cú pháp khóa ngoài. Và bạn không cần phải khai báo chỉ mục một cách dư thừa kể từ MySQL 4.1.2. –

+0

Ngoài ra hãy chắc chắn rằng cả hai bảng đều là InnoDB kể từ khi Bill chỉ ra, MyISAM không hỗ trợ khóa ngoài. – Abinadi

+7

Tôi đã bị bỏ phiếu hai lần do chỉ mục rõ ràng? Harsh. Tôi đã chỉ ra rằng InnoDB là cần thiết. – PatrikAkerstrand

3

Chỉ có thể có một khóa chính trên bảng. Thực tế trong có thể bao gồm nhiều trường không tăng số lượng khóa chính, vẫn còn một khóa.

Vì một phần của cặp PK không phải là duy nhất, bạn rõ ràng phải tạo một khóa ngoài tham chiếu đến hai trường: REFERENCES t1 (f1, f2).

1

Nếu chúng ta muốn logic cho chính nước ngoài một số như

FOREIGN KEY COmments(issue_id) 
REFERENCES Bugs(issue_id) OR FeatureRequests(issue_id) 

Ví dụ này:

CREATE TABLE Issues (
issue_id int PRIMARY KEY, 
status VARCHAR(20) 

); 




CREATE TABLE Comments (
comment_id int PRIMARY KEY, 
issue_type VARCHAR(20), -- "Bugs" or "FeatureRequests" 
issue_id BIGINT UNSIGNED NOT NULL, 
comment TEXT 
); 



CREATE TABLE Bugs (
issue_id int PRIMARY KEY, 
severity VARCHAR(20), 
FOREIGN KEY (issue_id) REFERENCES Issues(issue_id) 
); 
CREATE TABLE FeatureRequests (
issue_id int PRIMARY KEY, 
sponsor VARCHAR(50), 
FOREIGN KEY (issue_id) REFERENCES Issues(issue_id) 
); 





INSERT INTO Issues VALUES(1,'ON'),(2,'ON'),(3,'OFF'),(6,'OFF'),(8,'ON'); 

INSERT INTO Comments VALUES(1,'Bugs',1,'A'),(2,'Bugs',3,'B'),(3,'Bugs',1,'C'),(4,'Bugs',3,'D'),(5 ,'FeatureRequests',8,'L'), 
(6,'FeatureRequests',6,'W'),(7,'FeatureRequests',1,'ZX'); 



INSERT INTO Bugs VALUES(1,'severity_1'),(3,'severity_for_3'); 


INSERT INTO FeatureRequests VALUES(2,'sponsor_2_'),(8,'sponsor_for_8'),(1,'sponsor_for_1') 

chọn:

MariaDB [test]> SELECT * FROM Comments JOIN FeatureRequests ON Comments.issue_i 
d = FeatureRequests.issue_id AND Comments.issue_type= 'FeatureRequests'; 


MariaDB [test]> SELECT * FROM Comments JOIN Bugs ON Comments.issue_id = Bugs.is 
sue_id AND Comments.issue_type= 'Bugs'; 
+------------+------------+----------+---------+----------+----------------+ 
| comment_id | issue_type | issue_id | comment | issue_id | severity  | 
+------------+------------+----------+---------+----------+----------------+ 
|   1 | Bugs  |  1 | A  |  1 | severity_1  | 
|   2 | Bugs  |  3 | B  |  3 | severity_for_3 | 
|   3 | Bugs  |  1 | C  |  1 | severity_1  | 
|   4 | Bugs  |  3 | D  |  3 | severity_for_3 | 
+------------+------------+----------+---------+----------+----------------+ 
4 rows in set (0.00 sec) 
Các vấn đề liên quan