我的问题来自阅读数据库管理系统,第3版,Raghu Ramakrishnan和Johannes Gehrke。请参阅本文末尾的相关引用。
考虑第一种使用表约束的方法。
为什么“如果Sailors表为空,则此约束为 定义(根据表约束的语义)来定义 总是持有,即使我们在船上有超过100行“?
如果Sailors表为空,那么SELECT COUNT (S.sid) FROM
Sailors S
为零?
“表约束是否只有在关联时才需要保留 如果Sailors表为空,则表是非空的“矛盾” 约束被定义(根据表约束的语义) 总是举行“?
考虑使用断言而不是表约束的第二种方法
怎么做空 表影响断言,因此断言的第二种方法 可以通过表约束来解决第一种方法的问题吗?
第二种方法中的ASSERTION smallClub
被定义为
与第一种方法中的最后一次CHECK相同。它怎么解决
第一种方法中的问题,当水手表是空的时候?
感谢。
5.7.3断言:几个表上的IC
表约束与单个表相关联 CHECK子句中的条件表达式可以参考 其他表格。 表限制只需要保留 关联表是非空的。因此,当一个约束 涉及两个或多个表,表约束机制 有时候很麻烦而且不是很理想。涵盖这样的 在这种情况下,SQL支持创建断言 约束与任何一个表都没有关联。
作为一个例子,假设我们希望强制执行约束 船只的数量加上水手的数量应该少一些 (这是他要求的条件,例如,他要求获得资格 作为一个“小型”帆船俱乐部。)我们可以尝试下表 约束:
该解决方案存在两个缺点。它是相关的 与水手一起,尽管它完全涉及船只 对称的方式。更重要, 如果Sailors表为空,则定义此约束(根据表约束的语义)始终保持, 即使我们在船上有超过100行!我们可以 扩展此约束规范以检查Sailors是否 非空,但这种方法变得麻烦。CREATE TABLE Sailors ( sid INTEGER, sname CHAR( 10), rating INTEGER, age REAL, PRIMARY KEY (sicl), CHECK ( rating >= 1 AND rating <= 10) CHECK ( ( SELECT COUNT (S.sid) FROM Sailors S ) + ( SELECT COUNT (B. bid) FROM Boats B ) < 100 ))
最好的 解决方案是创建一个断言,如下所示:
CREATE ASSERTION smallClub CHECK ( ( SELECT COUNT (S.sid) FROM Sailors S ) + ( SELECT COUNT (B.bid) FROM Boats B) < 100)