【问题标题】:Trying to prevent duplicate entries in SQL Developer (Oracle)试图防止 SQL Developer (Oracle) 中的重复条目
【发布时间】:2013-01-20 21:33:55
【问题描述】:

我尝试创建一个触发器以防止在 SQL Developer (Oracle 11g XPRESS) 中插入重复条目,但它没有正确编译。你能帮我解释为什么,因为我看不到任何明显的语法错误。

CREATE OR REPLACE TRIGGER trig1

BEFORE INSERT ON table1

BEGIN 
  DECLARE CURSOR C1
  IS
    SELECT value1,value2 FROM inserted;

  DECLARE value11 number;
  DECLARE value22 number;
  OPEN C1;
  FETCH NEXT FROM C1 INTO @value11, @value22;

  WHILE FETCH_STATUS = 0
  LOOP
    IF NOT EXISTS (SELECT * FROM table1 WHERE value1 = @value11 AND value2 = @value22)
    THEN
        INSERT INTO table1 (value1,value2)
        VALUES
        (@value11, @value22);
    ELSE
        ROLLBACK TRANSACTION
        --DELETE FROM table1 WHERE value1 = @value11 AND value2 = @value22
        PRINT 'Cannot add duplicate entry.'
    END IF;
    FETCH NEXT FROM C1 INTO @value11, @value22;
  END LOOP; 
  CLOSE C1;
END;

【问题讨论】:

    标签: triggers oracle11g oracle-sqldeveloper duplicate-removal


    【解决方案1】:

    您的触发器的大部分问题都归咎于您使用了错误的语法;这看起来像 MySQL 而不是 PL/SQL。我建议在继续之前阅读 the documentation 并查看 some examples

    说了这么多;你正在以错误的方式处理这一切。为了防止插入重复项,您必须在您的表上创建一个unique constraint。这是保证您阻止它们的唯一方法;尝试在代码中解决它肯定会在某些时候失败。

    您可以内联创建唯一约束,或者如果您的表已经存在,您可以创建一个唯一索引:

    CREATE UNIQUE INDEX index_name
        ON table_name (column1, column2, ... column_n);
    

    或使用 ALTER TABLE 语句:

    ALTER TABLE table_name
      add CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);
    

    如果您要测试的列集是主键,您可以添加 primary key constraint

    除了强制完整性,无论您的用户决定什么,启用唯一约束使您能够简单地插入数据并捕获错误。插入前无需查询表,这应该会加快您的应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2015-11-29
      相关资源
      最近更新 更多