mysql - 在一个表中使用 2 个外键是否可以,其中一个必须为空?

标签 mysql sql null foreign-keys

如果我有一个表,其中每一行都是客户预订,那么在这个表中有 2 个外键是否可以:一个将为空,另一个引用适当的主键。我有两个表并对其应用了外键约束的原因是,预订可以是服务包 (service_package) 的预订,也可以是单个服务 (service) 的预订。

我猜这是个糟糕的设计,因为可以在同一预订行中注册两种预订,除非使用函数或存储过程强制实现限制。

这个解决方案是否可行,或者是否有更好的方法来做到这一点,比如为所提供的服务创建一个更通用的表?

最佳答案

这是一个合理的方法。当特定列的值为 NULL 时,连接将失败。

在 MySQL 中,您必须使用触发器强制执行此操作。其他数据库具有“检查约束”的概念,您可以在其中强制填充两个值之一。

如果您有更多列,您可能会想切换到“类型”列和“id”列。这要求所有的 id 都具有相同的类型。它还需要一个触发器来确保正确填充列。而且,它可能会在进行联接时导致错误。

在这两个备选方案中,我更喜欢您仅使用两个 ID 的方法。

关于mysql - 在一个表中使用 2 个外键是否可以,其中一个必须为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17560995/

相关文章:

PHP:更新和替换数据库中的行

sql - 如何从 30gb csv 文件中删除特定行(例如第 102,206,973 行)?

mysql convert_tz 命令返回 NULL

null - 假设的非空语言 - 如何实现链表?

c# - "null this"是可以接受的扩展方法使用吗?

mysql - 记录和统计用户登录的系统

mysql - 简单的调查数据库设计

mysql - 即使端口设置不正确,Django 也会连接到 mysql

mysql - 用于比较的除命令之外的 SQL

mysql - 使用 1 :n in different column 重复 SQL 表中的每个值 n 次