SQL Insert触发器干净地访问旧值?

时间:2014-06-12 14:44:42

标签: sql

除了基本的查询/插入之外,我是SQL的新手(因为当你进一步阅读时,你会很快看到)

这是一个(非常)简化的例子。

我有桌子' person'喜欢:

 UID | NAME | AGE | LOCATION
 45  | bob  | 23  | Canada 
 31  | bill | 20  | Romania 

和第二张表#person_history'喜欢:

UID | PID | NAME | AGE | LOCATION
 -  |  -  |  -   |  -  |     - 

当我像

一样插入此表格时
update person set age=10 where UID==45

我想触发我的触发器,亲自访问现有值,并将它们推入第二个表,然后继续原始插入。

我能想到的方法是:

 Select uid, name, age, location, 
 into v_uid, v_name, v_age, v_location 
 from person 
 where uid = :new.uid

然后像

那样插入
 Insert into person_history(UID, PID, NAME, AGE, LOCATION) 
 VALUES (sequence.nextval, v_uid, v_name, v_age, v_location); 

但这似乎是一种非常圆润的方式 - 特别是如果表有50列。

这是正确的方法,是否有更优雅的方法来解决这个问题。

再次,请记住我对所有这些都有多新,所以这些例子会非常有用。

1 个答案:

答案 0 :(得分:0)

为什么要这样做?:

 Select uid, name, age, location, 
 into v_uid, v_name, v_age, v_location 
 from person 
 where uid = :new.uid

只需使用此方法:

 INSERT INTO person_history(UID, PID, NAME, AGE, LOCATION) 
 VALUES (sequence.nextval, ::new.uid, ::new.name, ::new.age, ::new.location); 

关于列的数量,我不确定是否可以在更聪明的情况下进行操作"方式。