2009-06-04 80 views
40

我有一個主鍵由兩列組成的表(product_id,attribute_id)。我有另一個表需要引用此表。如何在另一個表中使外鍵將其鏈接到表中具有兩個主鍵的行上?MySQL中的多列外鍵?

回答

67

像這樣的東西應該做到這一點:

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的需要外鍵進行索引,因此在引用列的索引
  • 使用約束語法可以命名約束,如果需要,可以在稍後的時間更容易地進行修改和刪除。
  • InnoDB強制外鍵,MyISAM不強制。 (語法分析,但是忽略)
+1

FWIW, MyISAM解析並忽略外鍵語法。自從MySQL 4.1.2以後,您無需重複聲明索引。 – 2009-06-04 22:11:42

+0

還要確保這兩個表都是InnoDB,因爲Bill指出,MyISAM不支持外鍵。 – Abinadi 2009-06-05 03:28:42

+7

由於顯式索引,我被拒絕了兩次?苛刻。我確實指出InnoDB是必要的。 – PatrikAkerstrand 2009-06-05 05:50:32

3

表中只能有一個主鍵。可以由多個字段組成的事實不會增加主鍵的數量,但仍然有一個。

由於PK對的一部分不是唯一的,所以顯然必須創建引用兩個字段的外鍵:REFERENCES t1(f1,f2)。

1

如果我們想的邏輯外鍵一些這樣

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

例子:

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') 

選信號:

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)