它不知道这是否是一个好的设计实践,但可以肯定的是,一个表的复合外键是另一个表的复合主键的一部分。
假设我们有一个表 test1 有一个复合主键 (A, B)
现在我们可以有一个表说 test2 具有主键 (P, Q, R),其中 test2 的 (P,Q) 引用 test2 的 (A,B)。
我在 MySql 数据库中运行了以下脚本,它工作得很好。
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);
在上述情况下,数据库期望 (A,B) 的组合是唯一的,并且它是 test1 表中的主键。
但是,如果您尝试执行以下操作,脚本将会失败。数据库不允许您创建 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);
在上述情况下,数据库期望 A 列单独唯一,B 列也是如此。(A,B)的组合是否唯一无关紧要。