使用Firebird,如果我有一个由子查询约束到另一个表的检查,并且我写入子查询中违反检查的表,那么什么会失败?如果有的话?
如果没有任何失败,是否会在下一次使用检查约束从表中读取时违反约束?如果没有,Firebird会做些什么来防止在读取时违反约束?
示例
table_a
对column_a_table_a
的检查限制应为< SUM(column_a_table_b) FROM table_b
。
答案 0 :(得分:1)
CHECK CONSTRAINT
仅适用于它所定义的表,并且只有在约束是从应用它的行派生时才保证完整性。
第106页的“Interbase 6.0数据定义指南”(可从Firebird站点的reference manual section获取)中也记录了这一点:
注意仅当正在验证的值位于插入和删除的同一行时,
CHECK
约束才能保证数据完整性。如果您尝试比较同一个表或不同表中不同行中的值,则另一个用户可以稍后修改这些值,从而使插入时应用的原始CHECK约束无效。
因此,如果您修改table_b
以使table_a
的检查约束不再成立,那么您将不会收到错误,因为此约束不适用于此表。
现在,如果修改table_a
,则检查约束将触发并将导致错误(仅适用于已修改的行,并且仅在约束不再存在的情况下)。