我对构造SQL约束很困惑。
假设我有两个名为person和rent_car的表。人有两列名为person_id,job。 rent_car还有两个名为person_id和renting_date的列。
约束:
哪种方法适合我?触发,检查或断言以及为什么?
答案 0 :(得分:1)
触发器发生,声明性约束。
声明性约束描述了一个 state ,其中数据是有效的,因此它们必须始终满足。这意味着记录的有效性相对于如果记录中的数据发生变化,声明性约束可以更改 ;记录 的有效性不得 因宇宙某些其他部分的某些事件而发生变化。这就是为什么在执行它们的系统上,检查约束可能不会引用随时间变化的系统变量,如CURRENT_TIME
或CURRENT_USER
,或者表中的其他记录或其他表中的记录。外键约束的ON DELETE
和ON UPDATE
子句阻止父表的更改使子表中的记录无效。
另一方面,触发器是在离散时间点执行的过程。它执行的任何测试只需要在它们执行的瞬间满足,并且仅针对它们的参数的瞬时值进行测试。因此,触发器可以自由引用动态系统变量,其他记录,其他表甚至其他数据库。
然后问你的问题。我会在第二种情况下使用声明性约束,因为您要将记录与常量字符串进行比较。对于租金,它将取决于。如果数据库正在录制正在进行的租赁"现在,"然后将时间与"现在进行比较"这只能在触发器中完成。如果该表记录了对未来租赁的预订,则将租赁时间与常量进行比较,并且检查约束是合适的。
据我了解,断言是用于测试代码的正确性的工具,而不是数据的,因此不适合用于实现业务规则的工具
希望有所帮助。