Chiave esterna a più colonne in MySQL?

Ho una tabella che ha una chiave primaria composta da due colonne (product_id, attribute_id). Ho un’altra tabella che deve fare riferimento a questa tabella. Come posso creare una chiave esterna nell’altra tabella per collegarla a una riga nella tabella con due chiavi primarie?

Qualcosa del genere dovrebbe farlo:

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 richiede l’indicizzazione di chiavi esterne, quindi l’indice sulle colonne di riferimento
  • L’uso della syntax dei vincoli consente di assegnare un nome a un vincolo, rendendo più semplice l’alterazione e il rilascio in un secondo momento, se necessario.
  • InnoDB applica le chiavi esterne, MyISAM no. (La syntax viene analizzata ma ignorata)

Ci può essere solo una chiave primaria su un tavolo. Il fatto in può consistere di più di un campo non aumenta il numero di chiavi primarie, ce n’è ancora uno.

Poiché una parte della coppia PK non è univoca, è ovviamente necessario creare una chiave esterna che faccia riferimento anche a due campi: REFERENCES t1 (f1, f2).

Se vogliamo che la logica per le chiavi straniere sia come questa

 FOREIGN KEY COmments(issue_id) REFERENCES Bugs(issue_id) OR FeatureRequests(issue_id) 

Esempio:

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

SELEZIONA:

 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)