Tôi có một bảng có khóa chính bao gồm hai cột (product_id, attribute_id). Tôi có một bảng khác cần tham khảo bảng này. Làm thế nào tôi có thể làm cho một khóa nước ngoài trong bảng khác để liên kết nó với một hàng trong bảng với hai khóa chính?Khóa ngoài nhiều cột trong MySQL?
40
A
Trả lời
67
Something như thế này phải làm điều đó:
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 đòi hỏi các phím nước ngoài được lập chỉ mục, vì thế mà chỉ mục trên các cột tham khảo
- Sử dụng cú pháp hạn chế cho phép bạn đặt tên cho một hạn chế , làm cho nó dễ dàng hơn để thay đổi và thả vào một thời gian sau đó nếu cần thiết.
- InnoDB thi hành các khóa ngoại, MyISAM thì không. (Cú pháp được phân tách nhưng bỏ qua)
3
Chỉ có thể có một khóa chính trên bảng. Thực tế trong có thể bao gồm nhiều trường không tăng số lượng khóa chính, vẫn còn một khóa.
Vì một phần của cặp PK không phải là duy nhất, bạn rõ ràng phải tạo một khóa ngoài tham chiếu đến hai trường: REFERENCES t1 (f1, f2).
1
Nếu chúng ta muốn logic cho chính nước ngoài một số như
FOREIGN KEY COmments(issue_id)
REFERENCES Bugs(issue_id) OR FeatureRequests(issue_id)
Ví dụ này:
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')
chọn:
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)
Các vấn đề liên quan
- 1. Khóa chính nhiều cột trong MySQL 5
- 2. JPA 2: sử dụng nhiều cột trong khóa ngoài
- 3. Nhiều khóa/liên kết ngoài của cột trong ActiveRecord/Rails
- 4. Ràng buộc khóa ngoài của MySQL - Cột số nguyên
- 5. Bảng MySQL với cột VARCHAR là khóa ngoài
- 6. Khóa ngoài và Lỗi MySQL
- 7. Cột khóa ngoài tổng hợp trong GORM
- 8. MySQL - Cách chèn vào nhiều bảng có khóa ngoài
- 9. Khóa chính hai cột trong MySQL
- 10. MySQL: Chèn nếu khóa ngoài tồn tại
- 11. ScalaQuery nhiều khóa chính và khóa ngoài
- 12. MySQL chính/kích thước khóa ngoài?
- 13. Phân vùng bảng mySQL có khóa ngoài?
- 14. MySQL: xóa một hàng bỏ qua ràng buộc khóa ngoài
- 15. Câu hỏi khóa ngoài của MySQL
- 16. MySQL - Sử dụng khóa ngoài làm khóa chính quá
- 17. mysql có quá nhiều cột?
- 18. Chìa khóa nước ngoài cho một trong nhiều bảng?
- 19. Khóa ngoài của MySQL trên cùng một bảng
- 20. MySQL Nhiều ổ khóa bảng
- 21. Ánh xạ các khóa ngoài tổng hợp trong mối quan hệ nhiều-nhiều trong khung Entity
- 22. khóa chính/khóa ngoài trong uml
- 23. mysql trái tham gia với nhiều cột
- 24. MySQL: nhiều bảng hoặc một bảng có nhiều cột?
- 25. Ràng buộc khóa ngoài của MySQL, xóa tầng
- 26. Làm thế nào để thêm khóa ngoài (MySQL)
- 27. có thể tham chiếu một cột dưới dạng nhiều khóa ngoài
- 28. Khóa chính Sqlite trên nhiều cột
- 29. Cập nhật khóa trùng lặp - Nhiều cột
- 30. MySQL nhiều cột asc trật tự
FWIW, MyISAM phân tích cú pháp và bỏ qua cú pháp khóa ngoài. Và bạn không cần phải khai báo chỉ mục một cách dư thừa kể từ MySQL 4.1.2. –
Ngoài ra hãy chắc chắn rằng cả hai bảng đều là InnoDB kể từ khi Bill chỉ ra, MyISAM không hỗ trợ khóa ngoài. – Abinadi
Tôi đã bị bỏ phiếu hai lần do chỉ mục rõ ràng? Harsh. Tôi đã chỉ ra rằng InnoDB là cần thiết. – PatrikAkerstrand