我认为你可以通过statement trigger 实现这一点,这样的事情应该可以达到目的。当然,你应该从一个清理点开始,这意味着首先你需要将user表中的所有值更新为user_work表的最新状态。
我也相信@Littlefoot 声明是正确的,在两个表中保留相同的字段绝不是一个好主意。
我在这里给你的是一种解决方案,可以使用 user_work 表中的更改或新条目来维护用户表中的状态。我想这是你要求的。
让我们想象一下这种情况(我为表格使用了不同的名称)
SQL> create table user_names ( user_id number, username varchar2(1) , status varchar2(1) ) ;
Table created.
SQL> insert into user_names values ( 1 , 'A' , 1 );
1 row created.
SQL> insert into user_names values ( 2 , 'B' , 1 );
1 row created.
SQL> create table user_work ( user_work_id number, user_id number, status varchar2(1) ) ;
Table created.
在这种情况下,user_work 表中还没有行,所以让我们创建语句触发器来更新或插入
SQL> create or replace trigger upd_status_user
after insert or update on user_work
begin
merge into user_names t
using ( select * from user_work ) s
on ( t.user_id = s.user_id )
when matched then
update set t.status = s.status
where
s.user_work_id = ( select max(user_work_id) from user_work s where t.user_id = s.user_id ) ;
end;
/
Trigger created.
SQL>
现在我们测试一下
SQL> insert into user_work values ( 100 , 1 , 1 );
1 row created.
SQL> commit ;
Commit complete.
SQL> select * from user_names ;
USER_ID U S
---------- - -
1 A 1
2 B 1
SQL> insert into user_work values ( 101 , 1 , 0 );
1 row created.
SQL> commit ;
Commit complete.
SQL> select * from user_names ;
USER_ID U S
---------- - -
1 A 0
2 B 1
SQL> insert into user_work values ( 102 , 1 , 1 ) ;
1 row created.
SQL> commit ;
Commit complete.
SQL> select * from user_names ;
USER_ID U S
---------- - -
1 A 1
2 B 1
当我在 user_work 表中插入新记录时,您可以看到 user_names 表(您的用户表)的变化,保持最新状态。
如果我更新,它会发生同样的情况
SQL> update user_work set status = 0 where user_work_id=102 ;
1 row updated.
SQL> commit ;
Commit complete.
SQL> select * from user_names ;
USER_ID U S
---------- - -
1 A 0
2 B 1