2009-06-04 19 views
40

私は、2つの列(product_id、attribute_id)で構成される主キーを持つテーブルを持っています。私はこのテーブルを参照する必要がある別のテーブルを持っています。他のテーブルに外部キーを作成して、2つの主キーを持つテーブルの行にリンクするにはどうすればよいですか?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以降、インデックスを重複して宣言する必要はありません。 –

+0

Billが指摘するように、MyISAMは外部キーをサポートしていないので、両方のテーブルがInnoDBであることも確認してください。 – Abinadi

+7

私は明示的なインデックスのために2回投票されましたか?ハーシュ。私はInnoDBが必要であることを指摘しました。 – PatrikAkerstrand

3

テーブルにはプライマリキーが1つしか存在できません。 1つのフィールドが複数のフィールドで構成されていても、プライマリキーの数は増えません。

PKペアの一部が一意ではないため、明らかに2つのフィールドも参照する外部キーを作成する必要があります。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)