PL / SQL触发器以防止重复

时间:2012-12-03 18:05:39

标签: oracle plsql triggers duplicates

我有一个名为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;

所以上面的代码不起作用,我希望如此。有人可以突出我的错误吗? :)

3 个答案:

答案 0 :(得分:8)

目前,您的触发器是将插入的值(:NEW.studentrecordnumber_fk_nn等)与不存在的:OLD进行比较(:OLDINSERT触发器没有意义 - 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;
/