我有2张桌子'标签'和'音乐家'
CREATE TABLE label
(labId varchar(10) NOT NULL PRIMARY KEY,
labName varchar(20) NOT NULL
);
CREATE TABLE musician
(musId varchar(10) NOT NULL PRIMARY KEY,
musName varchar(30) NOT NULL,
labId varchar(10) NOT NULL,
CONSTRAINT MusLabel FOREIGN KEY (labId) REFERENCES label(labId)
);
我创建了一个触发器来限制标签在a中的音乐家数量 范围为1到5;所以例如标签x不能有6位音乐家:
CREATE OR REPLACE TRIGGER before_musician_insert
BEFORE INSERT ON musician
FOR EACH ROW
DECLARE
total integer;
BEGIN
SELECT COUNT(*) INTO total
FROM musician, label
WHERE musician.labId=label.labId;
IF (total < 0 OR total > 5)
THEN
DBMS_OUTPUT.PUT_LINE('Invalid');
END IF;
END;
/
当我将第6位音乐家插入具有相同标签ID的表中时,insert语句不会“触发”TRIGGER,并且第6个值将添加到表中。 我不知道如何解决这个问题。 我尝试了一个检查约束,但是使用了varchar值,它也没有工作。
感谢您的帮助。
答案 0 :(得分:0)
您的代码有多个问题。例如,它没有访问:new
。触发器位于错误的表格上。它没有错误生成。
我可能会建议这样的事情:
CREATE OR REPLACE TRIGGER before_labels_insert
BEFORE INSERT ON labels
FOR EACH ROW
DECLARE
v_total integer;
user_xcep EXCEPTION;
PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
BEGIN
SELECT COUNT(*) INTO v_total
FROM labels l
WHERE l.labId = :new.labId;
IF (v_total >= 5) THEN
DBMS_OUTPUT.PUT_LINE('Invalid');
RAISE user_xcep
END IF;
END;
答案 1 :(得分:0)
您的触发器在插入之前触发,因此执行查询时第六个条目不存在。
如果你想在插入第6个条目时出错,你可以使它成为一个AFTER触发器(并且每个语句触发一次,而不是FOR EACH ROW)。