sql - SQL 约束检查值存在于同一张表的另一列中
问题描述
我有一张表,其中每一行都是一项任务。每个任务都有一个父级(即实例化它的任务),或者一个空父级(任务在时间开始时发生)。我想给父列添加一个约束,使它只能取一个空值或任务列中已经存在的值,并且不等于它自己的任务。
tasks
=====
task (PK) | description | duration | parent
----------+-------------+----------+--------
ABC-123 | Foo | 10 | Null <--- OK
DEF-456 | Bar | 8 | ABC-123 <--- OK
GHI-789 | Baz | 12 | ABC-123 <--- OK
JKL-987 | Boz | 7 | Null <--- OK
MNO-654 | Foz | 88 | GHI-789 <--- OK
PQR-321 | Faz | 6 | ZZZ-999 <--- Not OK; parent doesn't exist
STU-123 | Fez | 5 | STU-123 <--- Not OK; can't be its own parent
我怎样才能做到这一点?我想添加一个约束,例如:
CONSTRAINT ck_parent_valid CHECK parent <> task AND parent NOT IN task
..但上面显然不起作用,因为我需要同时引用当前行中的任务和整个任务列。
解决方案
一种方法是向表中添加外键约束,RDBMS 会自动检查它,您也可以自动设置cascade update
或cascade delete
完成更改而无需任何编码。如下所示:
ALTER TABLE tasks
ADD CONSTRAINT FK_tasksParent
FOREIGN KEY (parent) REFERENCES tasks(task);
推荐阅读
- firebase - 从 Redux firebase saga 中使用的条件获得相同的响应
- excel - 选择“主”工作表时自动隐藏/取消隐藏“子”工作表
- google-app-engine - 如何为 404 错误添加自定义错误页面(找不到页面)
- java - java 7 的异步通道与非阻塞套接字通道的性能差异
- swift - 在 Alamofire5 上执行 SSL 固定?
- c# - SSIS 包在实时发布时失败
- java - Android 游戏,在游戏 UI HUD 中花费的时间仅显示两位小数(仅数百秒)
- javascript - jQuery 验证正则表达式捕获组
- java - 使用 MapStruct 招摇会抛出 org.springframework.context.annotation.ConflictingBeanDefinitionException
- java - 我收到错误 java.lang.ClassCastException: