可以通过写入子查询表来检查约束是否被违反?

时间:2013-10-22 19:24:27

标签: subquery firebird check-constraints

使用Firebird,如果我有一个由子查询约束到另一个表的检查,并且我写入子查询中违反检查的表,那么什么会失败?如果有的话?

如果没有任何失败,是否会在下一次使用检查约束从表中读取时违反约束?如果没有,Firebird会做些什么来防止在读取时违反约束?

示例

table_acolumn_a_table_a的检查限制应为< SUM(column_a_table_b) FROM table_b

1 个答案:

答案 0 :(得分:1)

CHECK CONSTRAINT仅适用于它所定义的表,并且只有在约束是从应用它的行派生时才保证完整性。

第106页的“Interbase 6.0数据定义指南”(可从Firebird站点的reference manual section获取)中也记录了这一点:

  

注意仅当正在验证的值位于插入和删除的同一行时,CHECK约束才能保证数据完整性。如果您尝试比较同一个表或不同表中不同行中的值,则另一个用户可以稍后修改这些值,从而使插入时应用的原始CHECK约束无效。

因此,如果您修改table_b以使table_a的检查约束不再成立,那么您将不会收到错误,因为此约束不适用于此表。

现在,如果修改table_a,则检查约束将触发并将导致错误(仅适用于已修改的行,并且仅在约束不再存在的情况下)。