secundaria - ¿Clave externa de múltiples columnas en MySQL?
llave foranea compuesta mysql (3)
Tengo una tabla que tiene una clave principal que consta de dos columnas (product_id, attribute_id). Tengo otra tabla que necesita hacer referencia a esta tabla. ¿Cómo puedo crear una clave externa en la otra tabla para vincularla a una fila de la tabla con dos claves principales?
Algo como esto debería hacerlo:
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 requiere que las claves foráneas sean indexadas, de ahí el índice en las columnas de referencia
- El uso de la sintaxis de restricción le permite nombrar una restricción, lo que facilita su alteración y descarte en un momento posterior si es necesario.
- InnoDB impone claves foráneas, MyISAM no. (La sintaxis se analiza pero se ignora)
Si queremos lógica para clave externa, algunas como esta
FOREIGN KEY COmments(issue_id)
REFERENCES Bugs(issue_id) OR FeatureRequests(issue_id)
Ejemplo:
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'')
SELECCIONA:
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)
Solo puede haber una clave principal en una tabla. El hecho de que puede consistir en más de un campo no aumenta el número de claves primarias, todavía hay una.
Como una parte del par PK no es única, obviamente debe crear una clave externa que también haga referencia a dos campos: REFERENCIAS t1 (f1, f2).