MySQL中的多列外键?

我有一个主键由两列(product_id,attribute_id)组成的表。 我有另一个表需要引用这个表。 如何在另一个表中使外键与两个主键在表中的一行相链接?

像这样的东西应该这样做:

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不强制。 (语法被parsing,但被忽略)

一个表上只能有一个主键。 可以由多个字段组成的事实不会增加主键的数量,还有一个。

由于PK对的一部分不是唯一的,所以显然必须创build引用两个字段的外键:REFERENCES t1(f1,f2)。

如果我们想要这样的外键的逻辑

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

select:

 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)