2012-10-11 12 views
5

解釋圖。SQL:使用聲明強制實施基數

兩個實體: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); 
+0

我不知道,居然還支持斷言 –

+0

無法看到這可怎麼執行的任何DBMS的,因爲你不能同時插入2個表 – RichardTheKiwi

+0

@RichardTheKiwi:此是延遲約束和事務的常見用法之一。 – beldaz

回答

3

我不知道任何DBMS已經實現了斷言。語法可以在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 
      ) 
     ) ;