Edw*_*ert 3 sql oracle constraints
我有一个包含Class,Teacher和Leader行的表,
Class和Teacher是Numbers,Leader是一个布尔值(实际上只是一个Char(1))
该表代表教师和班级之间的关系.
一个班级可以有很多老师,或者老师很多班级.
我需要制作一个约束或检查,以便对于每个不同的类,它出现的一个,只有一个行必须具有Leader为true.
例如.
Teacher | Class | Leader 1 | 1 | True 2 | 1 | False 2 | 2 | True
将被接受,因为每个不同的类都有一行,其中Leader值为true,但不超过一行.
如果有人能提出如何将此作为约束来表达的想法,将不胜感激.
创建一个基于函数的索引很容易,该索引强制执行约束的"不超过一个领导"部分
CREATE UNIQUE INDEX one_leader_per_class
ON your_table_name( (CASE WHEN leader = 'Y'
THEN class
ELSE null
END) );
Run Code Online (Sandbox Code Playgroud)
不幸的是,创建一个声明性约束来强制要求每个类都有一个领导者并不容易.我知道这样做的唯一声明方式是创建一个物化视图,按类聚合数据,设置物化视图REFRESH FAST并在物化视图上创建约束,以确保物化视图中的NUM_LEADERS列始终1.这要求您创建一个适当的物化视图日志,这会增加表上DML的开销.它还意味着在您提交之前不会违反约束,如果您的应用程序未编写为假定提交可能会失败,则可能会出现问题.