SQL: Enforce cardinality with assertions
-
06-07-2021 - |
Question
To explain the diagram.
Two entities: E1 & E2
Cardinality:
-from E1 to E2 (through relation R): (6,50)
-from E2 to E1 (through relation R): (3,5)
______ ^ ______
| E1 |___(6,50)____/R\____(3,5)___| E2 |
|______| \ / |______|
v
I'm supposed to enforce cardinality but the book doesn't dive too much into ASSERTION details. Would this be a correct way to enforce said cardinality?
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 );
La solution
I don't know of any DBMS that has implemented assertions. The syntax can be checked at Mimer online SQL-92 syntax validator:
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
)
) ;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow