我有一个名为TBLAPPLICATION的表,其中包含指定个人ID号的数据以及他们申请的作业的JobID。每个ID号可以拥有无限数量的应用程序,只要JobID每次都不同,因此没有重复的应用程序。
create or replace
TRIGGER trg_duplicateapplication BEFORE INSERT ON tblapplication FOR EACH ROW
BEGIN
IF :NEW.studentrecordnumber_fk_nn = :OLD.studentrecordnumber_fk_nn THEN
IF :NEW.jobid_fk_nn = :OLD.jobid_fk_nn
THEN RAISE_APPLICATION_ERROR( -20003, 'Error: duplicate application. You have already applied for this position.');
END IF;
END IF;
END;
所以上面的代码不起作用,我希望如此。有人可以突出我的错误吗? :)
答案 0 :(得分:8)
目前,您的触发器是将插入的值(:NEW.studentrecordnumber_fk_nn
等)与不存在的:OLD
进行比较(:OLD
对INSERT
触发器没有意义 - it's fields are always null
)。
除此之外,这几乎肯定是由DRI而不是触发器实现的 - (studentrecordnumber_fk_nn, jobid_fk_nn)
上的唯一索引如何?
答案 1 :(得分:0)
您可以使用MERGE语句在插入表格之前验证每对(id,application)(以检查它是否已经在表格中)。
http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_9016.htm#SQLRF01606
此致
Dariyoosh
答案 2 :(得分:0)
我不确定在你的表TBLAPPLICATION中哪个标识符是唯一的(可能是JobID?),并且你希望你不要复制(也许是studentrecordnumber_fk_nn?)。但我创建了一个脚本来防止studentrecordnumber_fk_nn上的重复。 在我的“字母表”示例中,我编写了一个完全相似的脚本来防止重复:您无法插入先前插入表中的字母。
我希望它会有所帮助。 ž
CREATE OR REPLACE TRIGGER trg_duplicateapplication
BEFORE INSERT
ON tblapplication
FOR EACH ROW
DECLARE
counter integer;
BEGIN
SELECT * INTO counter FROM
(SELECT COUNT(rownum) FROM tblapplication a
WHERE a.studentrecordnumber_fk_nn = :new.studentrecordnumber_fk_nn);
IF counter = 1 THEN
RAISE_APPLICATION_ERROR( -20003,
'Error: duplicate application. You have already applied for this position.');
END IF;
END;
/
––The Alphabet
CREATE TABLE alphabet
(letter VARCHAR2(2));
INSERT INTO alphabet VALUES ('A');
INSERT INTO alphabet VALUES ('B');
INSERT INTO alphabet VALUES ('C');
INSERT INTO alphabet VALUES ('D');
CREATE OR REPLACE TRIGGER insertvalue
BEFORE INSERT
ON alphabet
FOR EACH ROW
DECLARE counter INTEGER;
BEGIN
SELECT * INTO counter FROM
(SELECT COUNT(rownum) FROM alphabet a WHERE a.letter = :new.letter);
IF counter = 1 THEN
RAISE_APPLICATION_ERROR(-20012,'Duplicated value');
END IF;
END;
/