Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL插入触发器是否干净地访问旧值?_Sql - Fatal编程技术网

SQL插入触发器是否干净地访问旧值?

SQL插入触发器是否干净地访问旧值?,sql,Sql,除了基本的查询/插入之外,我还不熟悉SQL(进一步阅读后您会很快看到) 这里有一个(非常)简化的例子 我有一张“个人”表,如: UID | NAME | AGE | LOCATION 45 | bob | 23 | Canada 31 | bill | 20 | Romania 第二张表是“个人历史”,如: UID | PID | NAME | AGE | LOCATION - | - | - | - | - 当我像这样插入到这个表中时 upd

除了基本的查询/插入之外,我还不熟悉SQL(进一步阅读后您会很快看到)

这里有一个(非常)简化的例子

我有一张“个人”表,如:

 UID | NAME | AGE | LOCATION
 45  | bob  | 23  | Canada 
 31  | bill | 20  | Romania 
第二张表是“个人历史”,如:

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列时

这是正确的方法吗?有没有更优雅的方法来解决这个问题


再一次,请记住我对这一切是多么的陌生,所以举个例子会很有帮助

你为什么要做这部分

 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); 

关于列的数量,我不确定是否有可能以“更智能”的方式进行操作。

您使用什么数据库管理系统?总的来说,我认为你的方法非常好。如果您担心枚举列,我会重新考虑是否真的有必要在历史记录中包含所有列。