如何在新表中插入受影响的行

Posted

技术标签:

【中文标题】如何在新表中插入受影响的行【英文标题】:How to Insert affected rows in a new table 【发布时间】:2017-02-22 07:03:55 【问题描述】:

以下是我正在执行一些更新的虚拟表。在这里,我只是在操作“NAME”列。我需要的是插入受影响的行,(比如说)我将第二个更改为“ID”-2,然后我需要只将这一行插入到具有新/更新值的新表中。我曾尝试通过触发器这样做,但它会吐出有关表突变的错误。

   ID    NAME
================ 
    1    Vaz
    2    Dan
    3    Steve

我希望插入数据的表具有与上述表相同的结构和具有相同数据类型的相同列。

请建议这是否可以通过任何其他方式完成,或者我为触发器编写了错误的代码。这是我为此目的编写的代码:

CREATE OR REPLACE TRIGGER HR.ins_temp
after UPDATE OF name ON HR.TEMP2 FOR EACH ROW
BEGIN
INSERT INTO temp3
(SELECT NAME
FROM temp2
WHERE (:new.NAME<>:old.NAME));
END;

temp2 是操作表,temp3 是新的。

【问题讨论】:

【参考方案1】:

不需要选择。而且您可能还想将ID值放入表中temp3

CREATE OR REPLACE TRIGGER HR.ins_temp
after UPDATE OF name ON HR.TEMP2 FOR EACH ROW
BEGIN
    INSERT INTO temp3 (id, name)
    values (:new.id, :new.name);
END;
/

由于触发器被定义为update of name,您实际上不需要检查名称是否更改,但如果您愿意,您可以这样做:

CREATE OR REPLACE TRIGGER HR.ins_temp
after UPDATE OF name ON HR.TEMP2 FOR EACH ROW
BEGIN
  if (   (:new.name <> :old.name)
      OR (:new.name is null and :old.name is not null)
      OR (:new.name is not null and :old.name is null)) 
 then
    INSERT INTO temp3 (id, name)
    values (:new.id, :new.name);
  end if;
END;
/

【讨论】:

工作就像一个魅力,非常感谢。但是如果有很多列怎么办?我仍然会在插入时单独提及它们 @hashir:是的,你需要这样做,这就是 SQL insert 语句的工作原理。

以上是关于如何在新表中插入受影响的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WordPress 查询中获得受影响的行数?

在创建新表时插入另一个表中的值

受 BigQuery 查询影响的行数

getHibernateTemplate.save() - 如何获取受影响的行/新的自动增量

如何在具有某些首字母的新表中插入所有行(pl/sql)

如何复制临时表中列的默认约束?