如何理解SQL中的完整性约束的表约束和断言?

时间:2016-11-14 02:47:02

标签: sql database

我的问题来自阅读数据库管理系统,第3版,Raghu Ramakrishnan和Johannes Gehrke。请参阅本文末尾的相关引用。

  1. 考虑第一种使用表约束的方法。

    为什么“如果Sailors表为空,则此约束为 定义(根据表约束的语义)来定义 总是持有,即使我们在船上有超过100行“?

    如果Sailors表为空,那么SELECT COUNT (S.sid) FROM Sailors S为零?

    “表约束是否只有在关联时才需要保留 如果Sailors表为空,则表是非空的“矛盾” 约束被定义(根据表约束的语义) 总是举行“?

  2. 考虑使用断言而不是表约束的第二种方法

    怎么做空 表影响断言,因此断言的第二种方法 可以通过表约束来解决第一种方法的问题吗?

    第二种方法中的ASSERTION smallClub被定义为 与第一种方法中的最后一次CHECK相同。它怎么解决 第一种方法中的问题,当水手表是空的时候?

  3. 感谢。

      

    5.7.3断言:几个表上的IC

         

    表约束与单个表相关联   CHECK子句中的条件表达式可以参考   其他表格。 表限制只需要保留   关联表是非空的。因此,当一个约束   涉及两个或多个表,表约束机制   有时候很麻烦而且不是很理想。涵盖这样的   在这种情况下,SQL支持创建断言   约束与任何一个表都没有关联。

         

    作为一个例子,假设我们希望强制执行约束   船只的数量加上水手的数量应该少一些   (这是他要求的条件,例如,他要求获得资格   作为一个“小型”帆船俱乐部。)我们可以尝试下表   约束:

    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  )) 
    
         该解决方案存在两个缺点。它是相关的   与水手一起,尽管它完全涉及船只   对称的方式。更重要,   如果Sailors表为空,则定义此约束(根据表约束的语义)始终保持,   即使我们在船上有超过100行!我们可以   扩展此约束规范以检查Sailors是否   非空,但这种方法变得麻烦。

         

    最好的   解决方案是创建一个断言,如下所示:

    CREATE  ASSERTION  smallClub 
    CHECK  ( (  SELECT  COUNT  (S.sid)  FROM  Sailors S ) 
             + (  SELECT  COUNT  (B.bid)  FROM  Boats B) 
             < 100)
    

0 个答案:

没有答案