1

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

如果没有失败,下次从带有检查约束的表中读取时会违反约束吗?如果不是,Firebird 会做什么来防止在读取时违反约束?

例子

table_a有一个检查约束column_a_table_a应该是< SUM(column_a_table_b) FROM table_b.

4

1 回答 1

1

ACHECK CONSTRAINT仅适用于定义它的表,并且仅在约束源自它所应用于的行时才保证完整性。

这也记录在第 106 页的 Interbase 6.0 数据定义指南中(可从Firebird 站点的参考手册部分获得):

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

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

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

于 2013-10-22T19:39:50.023 回答