触发器会带来很大副作用,不建议使用。如果考虑到并发可能造成的脏数据,可以给表加一个唯一约束。你可以这样:新增一个列 是否离职(number 1:离职 0:未离职), 然后: CASE WHEN 是否离职 IS NULL or 是否离职=0 THEN 卡号 END。 职工在离职的时候除了更新时间外,还要更新 ”是否离职“。
类似于下面的做法应该是可以的吧,看执行结果的笔数就知道是否有Insert成功了。 -- ID=工号ID3,Card=卡号C1,trndate=离职时间 insert into t1 (id,card,trndate) select 'ID3','C1',null from dual where not exists(select 1 from t1 where card='C1' and (trndate is null or trndate>sysdate)) ;
merge into,用上面这个其实也一样 insert into t1 (id,card,trndate) select 'ID3','C1',null from dual where not exists(select 1 from t1 where card='C1' and (trndate is null or trndate>sysdate)) ; 只是这个能保证不重复吗?
merge into,用上面这个其实也一样 insert into t1 (id,card,trndate) select 'ID3','C1',null from dual where not exists(select 1 from t1 where card='C1' and (trndate is null or trndate>sysdate)) ; 只是这个能保证不重复吗?只要你的id字段是加上了unique约束,oracle就为你保证了不会重复,无论你横插还是竖插
新建一个job,每天扫描一次员工表,对于已离职的员工,更新badge对应的badgeid free状态为Y.
嗯,这个应该可以,新建table好像太麻烦了
触发器还是能不用就不用吧。
-- ID=工号ID3,Card=卡号C1,trndate=离职时间
insert into t1 (id,card,trndate)
select 'ID3','C1',null from dual where not exists(select 1 from t1 where card='C1' and (trndate is null or trndate>sysdate))
;
不过我很好奇,如果2个人同时执行这个SQL,能不能写入2行进table?
加上你的是否离职是否唯一判断条件,有什么问题
merge into,用上面这个其实也一样
insert into t1 (id,card,trndate)
select 'ID3','C1',null from dual where not exists(select 1 from t1 where card='C1' and (trndate is null or trndate>sysdate))
;
只是这个能保证不重复吗?
merge into,用上面这个其实也一样
insert into t1 (id,card,trndate)
select 'ID3','C1',null from dual where not exists(select 1 from t1 where card='C1' and (trndate is null or trndate>sysdate))
;
只是这个能保证不重复吗?只要你的id字段是加上了unique约束,oracle就为你保证了不会重复,无论你横插还是竖插