我有一张表 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/