我在实施数据库时遇到问题。我有2张桌子:
CREATE TABLE TAB1
(
TAB1_ID INT NOT NULL PRIMARY KEY,
TAB1_BOOL VARCHAR(4) NOT NULL CHECK (TAB1_BOOL IN('OPT1', 'OPT2'))
);
CREATE TABLE TAB2
(
TAB2_ID INT NOT NULL
);
我想将TAB2_ID作为TAB1_ID的外键,但是TAB2_ID只能是这些TAB1_ID,在表TAB1中的行用TAB1_BOOL == OPT1标记。例如:
TAB1 contains 2 rows:
1. 'TAB1_ID==1' 'TAB1_BOOL==OPT1',
2. 'TAB1_ID==2' 'TAB1_BOOL==OPT2'.
Now, statement like:
INSERT INTO TAB2 (TAB2_ID) VALUES (2);
should be rejected because row with TAB1_ID==2 is marked with OPT2
是否可以在Oracle SQL中做到这一点?
这可以通过使用触发器来实现:
CREATE TABLE TAB1 (
TAB1_ID INT NOT NULL PRIMARY KEY,
TAB1_BOOL VARCHAR(4) NOT NULL CHECK (TAB1_BOOL IN('OPT1', 'OPT2'))
);
CREATE TABLE TAB2 (
TAB2_ID INT NOT NULL,
FOREIGN KEY (TAB2_ID) REFERENCES TAB1 (TAB1_ID)
);
CREATE OR REPLACE TRIGGER CHECK_TAB2_ID
BEFORE UPDATE OR INSERT ON TAB2 FOR EACH ROW
DECLARE
CURSOR CHECK_CURSOR IS
SELECT TAB1_BOOL
FROM TAB1
WHERE TAB1_ID = :new.TAB2_id;
V_TAB1_BOOL VARCHAR(4);
BEGIN
OPEN CHECK_CURSOR;
FETCH CHECK_CURSOR INTO V_TAB1_BOOL;
IF (V_TAB1_BOOL <> 'OPT1') THEN
CLOSE CHECK_CURSOR;
raise_application_error(10000, 'Wrong value in TAB1');
END IF;
CLOSE CHECK_CURSOR;
END;
INSERT INTO TAB1 VALUES (1, 'OPT1');
INSERT INTO TAB1 VALUES (2, 'OPT2');
INSERT INTO TAB2 (TAB2_ID) VALUES (1);
上面的触发器中仍然存在一个小错误。我目前无法访问Oracle数据库,因此我很难修复它。这是我的小提琴。
ps:好的,;
小提琴里只有一个-这是一个更新。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句