MySQL 如何一次只允许一个父表主键被一个子表引用?

问题描述 投票:0回答:1

我有两个“子”表,它们引用相同的“父”表。 有没有一种方法可以在任何时候只允许最多一个“子”表引用父表

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);
mysql database-design foreign-keys primary-key
1个回答
0
投票

这是一个无需触发器即可强制执行您描述的约束的解决方案。

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
,因为它与检查约束不兼容。

© www.soinside.com 2019 - 2024. All rights reserved.