【问题标题】:Remove duplicates trigger Oracle删除重复项触发 Oracle
【发布时间】:2020-09-13 06:14:44
【问题描述】:

如果我使用相同的 cod_regista 插入多行,它会创建重复项,我该如何消除它们? 每个值我只需要一条记录

CREATE OR REPLACE TRIGGER piazzetta_trg
BEFORE INSERT OR UPDATE
ON regia_piazzetta
FOR EACH ROW
BEGIN
IF INSERTING THEN
     FOR a IN(SELECT cod_regista, SUM(costo_produzione) as tot
              FROM regia_piazzetta
              GROUP BY cod_regista)
        LOOP     
            INSERT INTO piazzetta_tot VALUES (a.cod_regista, a.tot);
        END LOOP;
    UPDATE piazzetta_tot SET costo_totale = costo_totale + :new.costo_produzione WHERE piazzetta_tot.id_regista = :new.cod_regista;
END IF;
IF UPDATING THEN 
    UPDATE piazzetta_tot SET costo_totale = costo_totale+(:new.costo_produzione - :old.costo_produzione) WHERE piazzetta_tot.id_regista = :new.cod_regista;
  END IF;
END;

【问题讨论】:

  • 不确定您要完成什么,但您的代码看起来有问题。每当您插入regia_piazetta 时,您都会尝试为所有不同的cod_regista 创建piazetta_tot 行,即使对于那些在插入语句中根本没有使用的行也是如此。也许(物化)视图会更好地满足您的要求。
  • 触发器中的删除指令可以使用LIMIT子句吗?
  • 行级触发器无法查询定义它的表。

标签: sql oracle plsql oracle-sqldeveloper plsqldeveloper


【解决方案1】:

不要使用触发器。创建

  • 主键,或
  • 唯一键(允许空值),或
  • 唯一索引

并让数据库处理重复项

或者,在INSERT 语句中将行插入表中时处理该问题。触发器应该是你最后的选择。

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2020-02-17
    相关资源
    最近更新 更多