SQL: 使用断言强制基数约束

5

解释该图。

两个实体:E1和E2

基数:

-从E1到E2(通过关系R):(6,50)

-从E2到E1(通过关系R):(3,5)

 ______               ^              ______
|  E1  |___(6,50)____/R\____(3,5)___|  E2  |
|______|             \ /            |______|
                      v

我应该强制执行基数,但是这本书没有深入探讨ASSERTION的细节。以下方法是否正确来强制执行所述基数?

CREATE ASSERTION assert
CHECK ( (SELECT COUNT(E1.ID) FROM E1) >= 6  AND 
        (SELECT COUNT(E1.ID) FROM E1) <= 60 AND 
        (SELECT COUNT(E2.ID) FROM E2) >= 3  AND 
        (SELECT COUNT(E2.ID) FROM E2) <= 5 );

我不知道有哪个数据库管理系统实际上支持断言。 - user330315
无法看出如何执行此操作,因为您无法同时插入到两个表中。 - RichardTheKiwi
1
@RichardTheKiwi:这是延迟约束和事务的常见用法之一。 - beldaz
1个回答

4

我不知道有哪个数据库管理系统实现了断言。可以在Mimer在线SQL-92语法验证器中检查语法:

CREATE ASSERTION assertion_R
  CHECK ( NOT EXISTS
            ( SELECT * 
              FROM E1 
                LEFT JOIN R
                  ON R.e1_id = E1.id
              GROUP BY E1.id
              HAVING COUNT(R.e1_id) NOT BETWEEN 6 AND 60
            )
       AND NOT EXISTS
            ( SELECT * 
              FROM E2 
                LEFT JOIN R
                  ON R.e2_id = E2.id
              GROUP BY E2.id
              HAVING COUNT(R.e2_id) NOT BETWEEN 3 AND 5
            ) 
        ) ;

我不知道有哪个数据库管理系统实现了断言。SQL Server的索引视图涵盖了许多(但并非全部)约束情况 - 这只是需要考虑的一些内容。 - Dai
@Dai 是的,一些情况可以使用索引视图来完成。 - ypercubeᵀᴹ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接