我对构造sql约束感到困惑。

假设我有两个名为person和rent_car的表。人有两列名为person_id,job。 rent_car还有两列,分别为person_id和renting_date。

限制条件:


如果某人是医生,则他/她只能在12.00至19.00之间租车。其他人可以在10.00至18.00之间租车。
如果人是医生,则ID必须包含“ dr”。


哪种方法适合我?触发,检查或声明,为什么?

最佳答案

触发发生,声明约束。

声明性约束描述了数据有效的状态,因此必须始终满足它们。这意味着只有在记录中的数据发生更改时,记录相对于声明性约束的有效性才能更改;记录的有效性不得因宇宙中其他部分的某些事件而改变。这就是为什么在强制执行约束的系统上,检查约束可能不会引用随时间变化的系统变量(例如CURRENT_TIMECURRENT_USER),表中的其他记录或其他表中的记录的原因。外键约束的ON DELETEON UPDATE子句可防止父表中的更改使子表中的记录无效。

另一方面,触发器是在离散时间点执行的过程。它执行的任何测试仅在执行它们的瞬间就需要满足,并且仅针对其参数的瞬时值进行测试。因此,触发器可以自由引用动态系统变量,其他记录,其他表甚至其他数据库。

那到你的问题。对于第二种情况,我将使用声明性约束,因为您正在将记录与常量字符串进行比较。对于租金,将取决于。如果数据库记录的是“现在”发生的租金,则将时间与“现在”进行比较,这只能在触发器中完成。如果该表记录了对未来租金的保留,则将租金时间与常量进行比较,并且检查约束将是适当的。

据我了解,断言是一种用于测试代码而非数据的正确性的工具,因此也不是用于实现业务规则的适当工具。

希望能有所帮助。

10-07 12:26
查看更多