我有两个“子”表,它们引用相同的“父”表。 有没有一种方法可以在任何时候只允许最多一个“子”表引用父表
Primary Key
。 实际上,两个“子”表包含不同的数据,因此要求它们是分开的,否则如果将它们合并到一个大表中,则会出现NULL
值。
例如: 取1的父级PK(
id_primary
),它只能被child_a
或child_b
引用(FK),但不能同时被两者引用。
CREATE TABLE `parent` (
`id_primary` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id_primary`));
CREATE TABLE `child_a` (
`id_primary` INT UNSIGNED NOT NULL,
`data` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id_primary`),
FOREIGN KEY (`id_primary`)
REFERENCES `parent` (`id_primary`)
ON UPDATE CASCADE
ON DELETE CASCADE);
CREATE TABLE `child_b` (
`id_primary` INT UNSIGNED NOT NULL,
`data` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id_primary`),
FOREIGN KEY (`id_primary`)
REFERENCES `parent` (`id_primary`)
ON UPDATE CASCADE
ON DELETE CASCADE);
这是一个无需触发器即可强制执行您描述的约束的解决方案。
CREATE TABLE `parent` (
`id_primary` INT UNSIGNED NOT NULL,
`child` CHAR(1) NOT NULL,
PRIMARY KEY (`id_primary`),
KEY (id_primary, child));
CREATE TABLE `child_a` (
`id_primary` INT UNSIGNED NOT NULL,
`data` INT UNSIGNED NOT NULL,
`child` CHAR(1) NOT NULL CHECK (`child`='a'),
PRIMARY KEY (`id_primary`),
FOREIGN KEY (`id_primary`,`child`)
REFERENCES `parent` (`id_primary`,`child`)
ON DELETE CASCADE);
CREATE TABLE `child_b` (
`id_primary` INT UNSIGNED NOT NULL,
`data` INT UNSIGNED NOT NULL,
`child` CHAR(1) NOT NULL CHECK (`child`='b'),
PRIMARY KEY (`id_primary`),
FOREIGN KEY (`id_primary`,`child`)
REFERENCES `parent` (`id_primary`,`child`)
ON DELETE CASCADE);
我必须删除
ON UPDATE CASCADE
,因为它与检查约束不兼容。