我正在建立住房社会管理系统的数据库。我有以下两个表。
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
表中输入任何HOUSE
,如果其状态是PLOT
表中的'UNSOLD'。我试过了但它不起作用:
CONSTRAINT PLOT_CONS CHECK (plotID (status IN('SOLD')));
最佳答案
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
关于sql - 如何使用一个表属性或其值作为对另一个表属性的约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43916697/