使用 Firebird,如果我有一个受子查询约束到另一个表的检查,并且我在子查询中写入会违反检查的表,如果有的话,什么会失败?
如果没有失败,下次从带有检查约束的表中读取时会违反约束吗?如果不是,Firebird 会做什么来防止在读取时违反约束?
例子
table_a
有一个检查约束column_a_table_a
应该是< SUM(column_a_table_b) FROM table_b
.
使用 Firebird,如果我有一个受子查询约束到另一个表的检查,并且我在子查询中写入会违反检查的表,如果有的话,什么会失败?
如果没有失败,下次从带有检查约束的表中读取时会违反约束吗?如果不是,Firebird 会做什么来防止在读取时违反约束?
例子
table_a
有一个检查约束column_a_table_a
应该是< SUM(column_a_table_b) FROM table_b
.
ACHECK CONSTRAINT
仅适用于定义它的表,并且仅在约束源自它所应用于的行时才保证完整性。
这也记录在第 106 页的 Interbase 6.0 数据定义指南中(可从Firebird 站点的参考手册部分获得):
注意仅当
CHECK
正在验证的值位于插入和删除的同一行中时,约束才能保证数据完整性。如果您尝试比较同一表或不同表的不同行中的值,则另一个用户稍后可能会修改这些值,从而使在插入时应用的原始 CHECK 约束无效。
因此,如果您修改table_b
应用到的检查table_a
约束不再成立,那么您将不会收到错误,因为此约束不适用于此表。
现在,如果您修改table_a
,检查约束将触发并导致错误(仅适用于修改后的行,并且仅在约束不再成立的情况下)。