MySQL中的多列外键?

61

我有一个表,它有两列作为主键 (product_id, attribute_id)。我有另一个需要引用该表的表。如何在另一个表中创建外键以将其链接到具有两个主键的表中的行?

3个回答

95

像这样做应该就可以了:

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
就此而言,MyISAM确实会解析并忽略外键语法。自MySQL 4.1.2版本以来,您无需重复声明索引。 - Bill Karwin
还要确保两张表都是 InnoDB,因为正如 Bill 指出的那样,MyISAM 不支持外键。 - Abinadi
8
因为明确的索引,我被投票否决了两次?很严厉。我确实指出InnoDB是必要的。 - PatrikAkerstrand
你说 - MySQL要求外键被索引,因此在引用列上建立索引 - 这不应该是被引用的列吗? - Vérace

3

一张表只能有一个主键。即使主键由多个字段组成,也不会增加主键的数量,仍然只有一个。

由于主键对中的某一部分不是唯一的,因此您显然还需要创建一个外键,将两个字段作为参考:REFERENCES t1(f1,f2)。


2
如果我们希望为外键添加逻辑,可以这样做:
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接