我有一個主鍵由兩列組成的表(product_id,attribute_id)。我有另一個表需要引用此表。如何在另一個表中使外鍵將其鏈接到表中具有兩個主鍵的行上?MySQL中的多列外鍵?
40
A
回答
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不強制。 (語法分析,但是忽略)
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)
相關問題
- 1. 多列上的MySQL外鍵?
- 2. MySQL多個外鍵
- 3. mySQL - 多個表的外鍵?
- 4. MySQL的外鍵多聯接
- 5. INNODB,mysql - 多行的外鍵?
- 6. mysql中的外鍵
- 7. MySQL中的外鍵?
- 8. EF:多列外鍵
- 9. 重命名MySQL中的外鍵列
- 10. MySQL選擇多個外鍵
- 11. MySQL多列主鍵
- 12. 外鍵的MySQL
- 13. Mysql的外鍵
- 14. 一個多列VS單柱的多個外鍵外鍵
- 15. ActiveRecord/Rails中的多列外鍵/關聯
- 16. MySQL的計數的多個外鍵
- 17. MySQL中的多列主鍵5
- 18. 檢查MySQL中的外鍵
- 19. MySQL Workbench中的外鍵
- 20. mysql中的外鍵問題
- 21. mySQL中的關係(外鍵)
- 22. Mysql的加入多個外鍵
- 23. MySQL創建多個外鍵的表
- 24. MySQL的多個外鍵約束
- 25. 在MySQL的多個外鍵連接表
- 26. MySQL的多元複合外鍵
- 27. 創建MySQL的更多外鍵
- 28. PHP的MySQL插入有多個外鍵
- 29. 多列外鍵約束上
- 30. 添加外鍵上多列
FWIW, MyISAM解析並忽略外鍵語法。自從MySQL 4.1.2以後,您無需重複聲明索引。 – 2009-06-04 22:11:42
還要確保這兩個表都是InnoDB,因爲Bill指出,MyISAM不支持外鍵。 – Abinadi 2009-06-05 03:28:42
由於顯式索引,我被拒絕了兩次?苛刻。我確實指出InnoDB是必要的。 – PatrikAkerstrand 2009-06-05 05:50:32