Oracle SQL / PL / SQL:如果更改/未找到则插入;别无所求

时间:2015-05-31 17:01:10

标签: sql oracle sql-merge

经过深思熟虑之后完全重复了这一点。最初我希望结合单独的MERGE声明,但忘记了。要明确这不是一个问题。如果找不到现有的匹配记录,我想添加一条新记录。

我们说mytable包含foobarbaz列。其中(如果与性能相关)foobar一起唯一标识记录。

a)如果不是foobar,则插入foobarbaz

b)否则,如果foobarbaz<new>不等于baz<old>插入foobar,{{1} }

c)如果所有三个匹配则不执行任何操作

请注意,baz<new>同样是新记录而非更新。基本上这是记录b的日志记录。

作为一个额外的好处,如果我能够获得MERGE语句(到baz)仅在my_second_tablea上尝试合并,那将是很好的,因为案例{{1}意味着b没有变化,因此我们不需要触摸另一个表。但我知道你不能拥有一切。

为什么他们不能像Mongo一样使用JavaScript?

1 个答案:

答案 0 :(得分:0)

无法在合并语句中更新两个表,但有几种选择。一个是向第一个表添加触发器。触发器将触发您想要的任何更改,并可以在第二个表中插入行:

CREATE TRIGGER IUA_Table1
AFTER INSERT OR UPDATE
ON Table1 FOR EACH ROW
BEGIN

  INSERT INTO LogTable(groupid, var, sku_no )
  VALUES(:new.groupid, var, sku_no);

END;

此触发器将在任何插入或更新时触发,因此不仅仅是您的合并声明。

请注意,某些人会触发并使用它们进行大多数事情,而其他人则非常不愿意将它们用于任何事情。就个人而言,我认为你不应该在触发器中放置太多的业务逻辑,但是对于这样的记录更改,这可能是可以接受的。