У меня есть таблица с первичным ключом, состоящим из двух столбцов (product_id, attribute_id). У меня есть другая таблица, которая должна ссылаться на эту таблицу. Как заставить внешний ключ в другой таблице связать его со строкой в таблице с двумя первичными ключами?
Многоуровневый внешний ключ в MySQL?
Ответ 1
Что-то вроде этого должно это сделать:
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 этого не делает. (Синтаксис анализируется, но игнорируется)
Ответ 2
В таблице может быть только один первичный ключ. Факт, в котором может состоять более одного поля, не увеличивает количество первичных ключей, еще один.
Поскольку часть пары PK не уникальна, вам, очевидно, необходимо создать внешний ключ, который также относится к двум полям: ССЫЛКИ t1 (f1, f2).
Ответ 3
Если нам нужна логика для внешнего ключа, вроде этого
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)