触发更新同一表中的另一个字段

时间:2011-09-23 08:08:30

标签: sql oracle triggers sql-update

我希望在更新数据库上的某个字段时运行触发器,因此它会更新另一个字段(基本上我们为每个记录都有2个不同的唯一ID,所以当更改一个时,我们还需要更新另一个 - 耶!)

CREATE OR REPLACE TRIGGER trigger_name ON table AFTER
  UPDATE AS
  UPDATE table A
  SET unique_to_update = NVL(
    (SELECT b.unique_to_update_from
    FROM table b
    WHERE B.other_unique_id = A.unique_id_to_match
    ), 0);

我不知道这是否有效(非常坦率地说,我很确定它会破坏它),即使它确实如此,它也会在该表的每一次更新中运行 - 而不仅仅是我想要的那个领域。

非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:2)

在投入生产之前测试任何东西。

这样的事情应该是你的触发器:

CREATE OR REPLACE TRIGGER trigger_name  
BEFORE UPDATE of unique_id_to_match
ON table
FOR EACH ROW
AS
BEGIN
  select 
    NVL(
      (SELECT b.unique_to_update_from
      FROM table b
      WHERE B.other_unique_id = :new.unique_id_to_match
      ), 0)
   into :new.unique_to_update 
   FROM dual;
END;

答案 1 :(得分:0)

5000行x 900列不是那么大:) 我担心它有10M的行:)

确定开始

create temporary table tmp_my_important_columns on commit delete rows 
as 
select unique_id_to_match, unique_to_update_from, 
       other_unique_id , unique_to_update 
from table where rownum < 1;

第二

CREATE OR REPLACE TRIGGER trigger_before_upd_stmt
BEFORE UPDATE
ON table
AS
BEGIN
insert into 
tmp_my_important_columns 
select unique_id_to_match, unique_to_update_from, 
       other_unique_id , unique_to_update 
from table;
END;

第三,

CREATE OR REPLACE TRIGGER trigger_name  
BEFORE UPDATE of unique_id_to_match
ON table
FOR EACH ROW
AS
BEGIN
  select 
    NVL(
      (SELECT b.unique_to_update_from
      FROM tmp_my_important_columns b
      WHERE B.other_unique_id = :new.unique_id_to_match
      ), 0)
   into :new.unique_to_update 
   FROM dual;
END;

评论:

  • 更新后,如果再次更新相同的行,则不提交 (删除tmp表),你会遇到问题。所以,或者你承诺 在更新之后,或者您可以从tmp表中添加删除所有内容的更新后触发器(不包括每行),但这有点难看。
  • 您可以在临时表上添加索引。