Es que no sé si eso es una buena práctica de diseño, pero seguro que es posible tener una clave foránea compuesta de una tabla que es la parte de la clave primaria compuesta de otra tabla.
decir que tenemos una tabla test1 que tienen una clave principal compuesta (A, B)
Ahora podemos tener una tabla decir test2 tener clave primaria (P, Q, R), donde en (P, Q) de test2 haciendo referencia (A, B) de test2.
Ejecuté la siguiente secuencia de comandos en la base de datos MySql y funciona muy bien.
CREATE TABLE `test1` (
`A` INT NOT NULL,
`B` VARCHAR(2) NOT NULL,
`C` DATETIME NULL,
`D` VARCHAR(45) NULL,
PRIMARY KEY (`A`, `B`));
CREATE TABLE `test2` (
`P` INT NOT NULL,
`Q` VARCHAR(2) NOT NULL,
`R` INT NOT NULL,
`S` DATETIME NULL,
`T` VARCHAR(8) NULL,
PRIMARY KEY (`P`, `Q`, `R`),
INDEX `PQ_idx` (`P`,`Q` ASC),
CONSTRAINT `PQ`
FOREIGN KEY (`P`, `Q`)
REFERENCES `test1` (`A`,`B`)
ON DELETE CASCADE
ON UPDATE CASCADE);
En el caso mencionado anteriormente, la base de datos está esperando la combinación de (A, B) a ser único y es, al ser una clave primaria en la tabla test1.
Pero si intenta hacer algo como siguiente, el guión sería un fracaso. La base de datos no le permite crear la tabla test2.
CREATE TABLE `test2` (
`P` INT NOT NULL,
`Q` VARCHAR(2) NULL,
`R` DATETIME NULL,
`S` VARCHAR(8) NULL,
`T` VARCHAR(45) NULL,
INDEX `P_idx` (`P` ASC),
INDEX `Q_idx` (`Q` ASC),
CONSTRAINT `P`
FOREIGN KEY (`P`)
REFERENCES `test1` (`A`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `Q`
FOREIGN KEY (`Q`)
REFERENCES `test1` (`B`)
ON DELETE CASCADE
ON UPDATE CASCADE);
En el caso mencionado anteriormente la base de datos podría esperar que la columna A sea única individual y la misma sigue para la columna B. No importa si la combinación de (A, B) es única.
¿Cómo se ha definido la clave primaria compuesta? ¿Ha agregado una restricción única en _each_ column? – Oded
Pero no quiero que cada columna sea única. Quiero que una combinación de dos o tres columnas sea única. – Tony
Le pregunté cómo definió las restricciones. No dije que debieras definirlos de esa manera. – Oded