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)
我不知道有哪个 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)