2012-12-04 50 views
2

我有一個表稱爲病房(處理醫院):患者約束數量

Create table ward(
    Wno varchar(15) Primary Key, 
    Name varchar(20) Not Null, 
    Number_of_beds integer Not Null 
); 

和一張桌子:

Create table patient(
    Pid varchar(15) Primary Key, 
    Name varchar(20) Not Null, 
    Address varchar(50) Not Null, 
    Date_of_birth date Not Null 
); 

我需要以某種方式限制患者,以便如果患者被分配到特定的病房,那麼病人的數量不能超過病房的病牀數量。 我想將Wno作爲外鍵添加到患者表中,但並不知道該從哪裏去。

+1

那是什麼「學生」在患者臺上在幹什麼? :P你可以在病人身上加入Wno,這樣兩個實體之間就可以有更好的關係。 – bonCodigo

+0

對不起,這是一個錯字,意思是如果病人被分配了:P –

+0

@CraigTraynor:你的oracle版本是什麼? –

回答

2

您可以將外鍵添加到患者表中,如下所示。道歉這個查詢是在MYSQL中。我注意到你需要Oracle。然而,邏輯是類似的:)語法需要改變。

Create table ward(
    Wno varchar(15) Not null Primary Key, 
    Name varchar(20) Not Null, 
    Number_of_beds integer Not Null 
); 

而對於患者的表:

Create table patient(
    Pid varchar(15) Primary Key, 
    Name varchar(20) Not Null, 
    Address varchar(50) Not Null, 
    Date_of_birth date Not Null, 
    WardNo varchar(15), 
    foreign key (wardno) references ward (wno) ' -- adds the foreign key relation 
); 

爲了檢查是否病房已滿,你可以有一個insertupdate trigger

免費牀位數可以通過下面的查詢來獲得:

SELECT p.wardno, (w.number_of_beds - count(pid)) as freebeds 
from patient as p 
left join ward as w 
on p.wardno = w.wno 
group by wardno 

現在我們創建一個觸發器來檢查是否有任何pa tient是進入病房whre freebed數= 0

更新到Oracle版本

CREATE OR REPLACE TRIGGER FreeBedsWardTrigger 
     BEFORE UPDATE OR INSERT 
     ON patient 
     FOR EACH ROW 
    DECLARE 
     max_beds INTEGER; -- max number of beds for the ward 
     used_beds INTEGER; -- used beds for the ward 
    BEGIN 
     SELECT COUNT (pid) 
     INTO used_beds 
     FROM patient 
     WHERE wardno = :NEW.wardno; 

     SELECT number_of_beds 
     INTO max_beds 
     FROM ward 
     WHERE wno = :NEW.wardno; 

     IF (max_beds - used_beds) > 0 
     THEN 
      RETURN; 
     ELSE 
      RAISE_APPLICATION_ERROR (-100100, 
            'No more beds available in this ward.'); 
     END IF; 
    END; 
+0

感謝@Sathya驗證它併爲OP的參考添加標題。我在PL/SQL上將它寫出內存。 :)所以我不敢聲明它是正確的語法 – bonCodigo

+0

[[轉換爲PL/SQL](http://stackoverflow.com/posts/13701497/revisions)由[@Gaurav](http:// stackoverflow。 com/users/1138658/gaurav-soni),我只是將它格式化了一點。由於他的信用:) – Sathya

+1

使用觸發器來執行這是一個肯定的火災方式,有一天,規則被打破。如果您連續訪問表(例如,在插入+確定計數等之前獲得鎖的API),則使用觸發器僅「OK」。想想當2個會話在其中一個提交事務之前執行插入操作時會發生什麼。 – DazzaL