SQL:使用断言强制基数

ecr*_*ecr 5 sql constraints cardinality assertion

解释图.

两个实体:E1和E2

基数:

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

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

 ______               ^              ______
|  E1  |___(6,50)____/R\____(3,5)___|  E2  |
|______|             \ /            |______|
                      v
Run Code Online (Sandbox Code Playgroud)

我应该强制执行基数,但这本书并没有过多地介绍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 );
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 4

我不知道有哪个 DBMS 实现了断言。可以在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
            ) 
        ) ;
Run Code Online (Sandbox Code Playgroud)