如何在另一个表的属性中使用一个表属性或其值作为约束

时间:2017-05-11 13:21:35

标签: sql oracle

我正在为住房社会管理系统制作数据库。我有两张桌子。

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

我想对HOUSE表的属性应用约束,即> plotiID(外键)&如果{{1>}表中的状态 ' UNSOLD' ,则约束不应允许用户输入plotID表中的任何HOUSE表。

我试过这个。但它不起作用:

PLOT

1 个答案:

答案 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;
/

有关Oracle触发器的更多信息:https://docs.oracle.com/cloud/latest/db112/LNPLS/triggers.htm