mysql - 创建两个具有相同主键的子类型(或子)表,这也是父表 sql 的外键
问题描述
我有以下表格:
CREATE TABLE employee(
id INT(11) UNSIGNED PRIMARY KEY,
namee VARCHAR(60) NOT NULL)
ENGINE = InnoDB;
CREATE TABLE consierge(
id INT(11) UNSIGNED PRIMARY KEY,
namee VARCHAR(60) NOT NULL,
zonee VARCHAR(20),
functionn VARCHAR(20),
FOREIGN KEY (id) REFERENCES employee(id))
ENGINE = InnoDB;
CREATE TABLE guard(
id INT(11) UNSIGNED PRIMARY KEY,
namee VARCHAR(60) NOT NULL,
rol VARCHAR(20) NOT NULL,
wtime ENUM ('Day','Night'),
FOREIGN KEY (id) REFERENCES employee(id))
ENGINE = InnoDB;
当我尝试创建一个看门人或警卫时,它首先验证员工中是否存在该 ID,这很好。问题是,即,当一个 id 已经在看守(因此在员工中)并且我创建一个具有相同 id 的 consierge 时,consierge 被创建,因此,一个员工可以是看守和看门人;我希望员工可以独家看守或看管。
解决方案
您可以使用一些附加逻辑和生成的列来执行此操作(无需触发器):
CREATE TABLE employee(
id INT(11) UNSIGNED PRIMARY KEY,
namee VARCHAR(60) NOT NULL,
type varchar(255),
c_id int generated always as (case when type = 'c' then id end) stored,
g_id int generated always as (case when type = 'g' then id end) stored,
check (type in ('c', 'g'))
);
CREATE TABLE consierge (
id INT(11) UNSIGNED PRIMARY KEY,
namee VARCHAR(60) NOT NULL,
zonee VARCHAR(20),
functionn VARCHAR(20),
type varchar(255) generated always as ('c') stored,
unique (type, id),
FOREIGN KEY (id) REFERENCES employee(id)
);
CREATE TABLE guard(
id INT(11) UNSIGNED PRIMARY KEY,
namee VARCHAR(60) NOT NULL,
rol VARCHAR(20) NOT NULL,
wtime ENUM ('Day','Night'),
type varchar(255) generated always as ('g') stored,
unique (stored, id),
FOREIGN KEY (id) REFERENCES employee(id)
);
ALTER TABLE employee ADD CONSTRAINT fk_employee_c_id
FOREIGN KEY (c_id) REFERENCES concierge(id);
ALTER TABLE employee ADD CONSTRAINT fk_employee_g_id
FOREIGN KEY (g_id) REFERENCES guard(id);
这会添加计算列以允许所需的外键关系。
推荐阅读
- javascript - Ag-grid - 具有可扩展高度单元会导致渲染问题
- mongodb - 使用 MongoDB Atlas 的烧瓶用户
- reactjs - 如何将道具从功能组件传递到类组件
- javascript - javascript在动态生成的元素中设置onclick
- android - 需要帮助使用 Google Oauth 和 Android 配置 Django Rest API
- deep-learning - 关于过拟合模型
- haxe - 裸包声明的目的是什么,它有什么作用?
- java - 为什么JDK Thread StackSize 为0?
- rust - 如何使用 serde 反序列化结构中的 json 格式的结构数组?
- javascript - 后续的变量声明必须具有相同的类型。变量“where”必须是“any[]”类型,但这里有“string[]”类型