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を外部キーとして患者テーブルに追加することを考えましたが、そこからどこに行くべきか本当にわかりません。

4

1 に答える 1

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
 );

病棟が満員かどうかを確認するために、insertまたはupdate 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

次に、フリーベッドカウント= 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;
于 2012-12-04T11:06:46.867 に答える