mysql - 两个外键,其中一个不为 NULL : How to solve this in SQL?

标签 mysql sql database-design innodb mysql-5.5

我有一张表 time。时间条目(1:n 关系)要么属于project 条目,要么属于special_work 条目。必须设置项目 ID 或 special_work id,两者都不能设置(独占或)。

CREATE TABLE `time` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `project` int(20) NOT NULL,
  `special_work` int(20) NOT NULL,
  `date` date NOT NULL,
  `hours` float NOT NULL,
  `time_from` time DEFAULT NULL,
  `time_to` time DEFAULT NULL,
  `notes` text NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`project`) REFERENCES `project`(`id`)
  FOREIGN KEY (`special_work`) REFERENCES `special_work`(`id`)
) DEFAULT CHARSET=utf8;

我怎样才能用 SQL 写这个?除了触发器之外还有什么办法吗?

如果您确定这是糟糕的数据库设计 - 是否有更好的建模方法?但是我想要两个不同的时间表

我的数据库是 Mysql 5.5 InnoDB。

最佳答案

您的数据模型没问题。在大多数数据库中,您还需要添加一个 check 约束:

alter table `time` add constraint chk_time_project_special_work
    check (project is not null xor special_work is null);

但是,MySQL 不支持检查约束。如果您真的愿意,可以使用触发器来实现逻辑。

关于mysql - 两个外键,其中一个不为 NULL : How to solve this in SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45349583/

相关文章:

sql - 一次查询中总和的平均值

java - 是否应该将模型列表放入另一个模型中?

php - 我无法连接到mysql

MySQL 数据库 - 在用户之间共享内容的表

php - Mysql:将数据数组存储在单个列中

sql - 将 CONTAINS 与变量 sql 一起使用

mysql-server-5.7 尚未配置

mysql - 选择表列标题作为值

database-design - 为什么将问题和答案放在同一个数据库表中是有益的?

mysql - 是否可以使用动态外键,最好/正确的做法是什么?