mysql - 我想在我的架构上添加这个约束

标签 mysql sql

我将 ER 图转换为模式,但是我来到这个表,其中只有 1 位主管或 1 条记录

CREATE TABLE Managers
(
SIN int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK ?????
)

那么,有谁知道如何将这个约束施加到架构上?

最佳答案

您必须添加一个触发器来检查该约束。

在开始对触发器进行编程之前,我认为您的数据模型可以进一步优化。 MANAGERS 应该对 EMPLOYEES 表具有 FK。 EMPLOYEES(和 CUSTOMERS)表应该具有与 PEOPLE 表的 FK。

创建一个表来仅存储一个实例(一条记录)是很少见的。您可以在 ORGANIZATIONS 和 MANAGERS 表之间设置约束,表示一个组织只能有一名经理。通过定义从组织到经理的 FK 来实现这一点。如果您想要强制执行组织应始终拥有经理的约束,请将 NOT NULL 添加到 MANAGERS 的 FK 定义中。

CREATE TABLE ORGANISATIONS (
   Id          INTEGER     NOT NULL,
   ...
   ManagerId   INTEGER     NOT NULL,
   ...
 )

当您这样做时,您不需要触发器。触发器可能很棘手。当您可以避免使用它们时,请不要使用它们。它们是数据库中的“暗物质”。您可能会在数据库中找到没有人输入过的内容。很有可能这是某种不明原因的触发因素。有时,当您更改表时,其上定义的触发器可能会变得不活动。突然间,你的数据库不再正常运行......暗物质。

关于mysql - 我想在我的架构上添加这个约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9856182/

相关文章:

mysql - 使用 innoDb 实现搜索功能的最佳方式

c# - 高性能数据插入 SQL Server

mysql UPDATE 组的最大值使用同一组的 MIN(id) 的 `open` 值,多行

javascript - 使用 PHP : Fatal error: Uncaught Error: Call to undefined function mysql_connect() 创建登录页面

用于优先匹配模式/文本的 MySQL 逻辑

java - Hibernate:如果外键为空,则按链接表中的字段排序

mysql - 如何删除数据库中MySQL表中的相关数据?

sql - 选择表中的人员并排除妻子,但合并他们的名字

sql - 多个字段的 CASE 语句结果

sql - 将 unix 时间戳转换为 Date 和 DateTime - SQL/ORACLE