2017-05-11 4 views
3

私は住宅社会管理システムのデータベースを作成しています。私は次の2つのテーブルを持っています。あるテーブル属性またはその値を他のテーブルの属性に対する制約として使用する方法

私はある HOUSEテーブルの属性に制約を適用する
CREATE TABLE PLOT (plotID number(3) PRIMARY KEY, 
        blockName char REFERENCES blockINFO, 
        ownerID number(13) REFERENCES OWNER, 
        status varchar2(10) NOT NULL, 
     CONSTRAINT PLOT_CONS CHECK ((Status IN ('SOLD', 'UNSOLD')))); 

CREATE TABLE HOUSE (houseID number(3) PRIMARY KEY, 
        plotID number(3) REFERENCES PLOT) 
     CONSTRAINT PLOT_CONS CHECK (plotID (Status NOT IN ('UNSOLD')))); 

- > plotiID(外部キー)&制約はその状況「売れ残り」であれば、ユーザはHOUSEテーブル内の任意のplotIDを入力できるようにするべきではありませんPLOTテーブル。

私はこれを試しました。動作していない:

CONSTRAINT PLOT_CONS CHECK (plotID (status IN('SOLD')));

+0

? SQLの質問には必ずDBMSタグを入れてください。 –

+0

あなたはたぶん制約の代わりにトリガーでそれを処理する必要があります –

+0

トリガーでこれを行う方法 –

答えて

0

BEFORE INSERTトリガーがこれを処理するための最も適切な方法です。挿入を実際に行う前に、必要な条件をすべてチェックすることができます。次のようなものがあなたを助けます。オラクルの

CREATE OR REPLACE TRIGGER checkPlotStatus 
BEFORE INSERT 
    ON HOUSE 
DECLARE 
    plot_status VARCHAR(10); 
BEGIN 
    --Get the plot status for the plot id you are trying to insert 
    SELECT status INTO plot_status 
    FROM PLOT 
    WHERE plotID=:new.plotID; 

    --If that status is UNSOLD, then raise an application error. 
    --Else, do the insertion 
    IF plot_status = 'UNSOLD' THEN 
     RAISE_APPLICATION_ERROR(-20000, 'Status of plot is unsold!'); 
    ELSE 
     INSERT INTO HOUSE 
     VALUES (:new.houseID, :new.plotID); 
    ENDIF; 
END; 
/

詳しい情報はトリガー:あなたが使用しているDBMS https://docs.oracle.com/cloud/latest/db112/LNPLS/triggers.htm

関連する問題