DB2 Old-New-Final-Table中间结果表
DB2 Old-New-Final-Table中间结果表DB2底层通过维护事物表,来对表进行添加,更新,和删除操作,这些事物表有:NEW TABLE,OLD TABLE,FINAL TABLE;他们也叫中间结果表。当进行insert或update的时候,new table包含着将要添加的数据行或进行更新的数据值;当进行update或delete的时候,old table包含着将要被更新的值或将要被删除的值。1、Old Table“存储”更新或者将要删除的数据,类似于触发器中refferencing old as olddata存储的数据,Old Table仅限于应用在update和delete操作中。create table empk(empno varchar(6),ename varchar(15),salary decimal(9,2))insert into empkselect empno,lastname,salaryfrom employeeorder by salary descfetch first 5 rows onlydb2 => select * from empkEMPNO ENAME SALARY------ --------------- -----------000010 HAAS 152750.00000030 KWAN 98250.00000070 PULASKI 96170.00000020 THOMPSON 94250.00000090 HENDERSON 89750.00下面更新empno为000090的员工薪水,更新的同时,我们想看下他的旧工资。db2 => select * from old table(update empk set salary=50000 where empno='000090')EMPNO ENAME SALARY------ --------------- -----------000090 HENDERSON 89750.00下面是更新之后的数据:db2 => select * from empk where empno='000090'EMPNO ENAME SALARY------ --------------- -----------000090 HENDERSON 50000.00当我们删除数据的时候,查看下被删除的数据:db2 => select * from old table(delete from empk where salary<80000)EMPNO ENAME SALARY------ --------------- -----------000090 HENDERSON 50000.002、New Tablenew table存储新的数据,类似于触发器中referrencing new as newdata存储的新数据值,仅限于应用在update和insert语句中。在插入数据的同时我们想看下,新增加的值,但这只能查看新数据,不能像trigger那样对数据进行加工。db2 => select * from new table(insert into empk values('000050','yeeXun',80000))EMPNO ENAME SALARY------ --------------- -----------000050 yeeXun 80000.00下面这个例子从employee表中取工资对低的3位员工信息,添加到empk表中:select * fromnew table(insert into empkselect empno,lastname,salaryfrom employeeorder by salary ascfetch first 3 rows only)EMPNO ENAME SALARY------ --------------- -----------200340 ALONZO 31840.00000290 PARKER 35340.00200330 WONG 35370.00此时的表中数据为:db2 => select * from empkEMPNO ENAME SALARY------ --------------- -----------000010 HAAS 152750.00000030 KWAN 98250.00000070 PULASKI 96170.00000020 THOMPSON 94250.00000050 yeeXun 80000.00200340 ALONZO 31840.00000290 PARKER 35340.00200330 WONG 35370.00下面给工资低于800000的员工涨工资,并查看涨工资后的工资:db2 => select * from new table(update empk set salary = salary * 1.2 where salary < 80000)EMPNO ENAME SALARY------ --------------- -----------200340 ALONZO 38208.00000290 PARKER 42408.00200330 WONG 42444.003、Inlcude如果我们在更新一条数据的同时,想同时查看旧数据(更新之前)和新数据(更新之后),根据上面讲到的new table和old table,我们可以使用两个语句查看,如:select salary from old table(update empk set salary=salary*1.1 where empno='200330')union allselect salary from new table(update empk set salary=salary*1.1 where empno='200330')然而,当执行此语句的时候,我们会得到如下的错误信息:SQL20165N 在指定 SQL 数据更改语句的上下文中,不允许 FROM 子句中的 SQL数据更改语句。SQLSTATE=428FLinclude关键词可以解决此问题,在更新数据的时候,可以同时把新旧数据查询出来,下面是实例:select empno,salary as new_salary,old_salaryfrom new table(update empk include(old_salary decimal(9,2))set salary=salary*1.1,old_salary=salarywhere empno='200330')EMPNO NEW_SALARY OLD_SALARY------ ----------- -----------200330 46688.40 42444.001 条记录已选择。表中的数据也是如此:db2 => select * from empk where empno='200330'EMPNO ENAME SALARY------ --------------- -----------200330 WONG 46688.401 条记录已选择。4、Final Tablefinal table“存储”数据修改操作、引用完整性操作和触发器操作之后的数据,它可以用来检查在执行insert,update或者delete的时候,易做图作的数据是否存在触发器或者引用约束,此时final table关键词会导致这些操作停止。如下面这个例子中,我们创建一个触发器,给新增员工增加10%的工资。create trigger trig_empkafter insert on empkreferencing new as nfor each rowmode db2sqlupdate empk set salary=n.salary*1.1where empno=n.empno在执行下面语句的时候,我们就知道了,final table可以有效的避免这种隐藏的数据更改的操作。select * from final table(insert into empk(empno,ename,salary) values('120821','ChenLinBo',50000))★SQL0989N AFTER 触发器 "TRIG_EMPK" 尝试了修改表 "EMPK" 中由 FROM 子句内的 SQL数据更改语句修改的行。SQLSTATE=560C3db2 => select count(*) from empk where e上一个:DB2向表中写数据的几种方法
下一个:DB2 Load导入自增字段数据
- 更多DB2疑问解答:
- sql语句 从DB2移动到其他数据库
- DB2 character类型更新报错
- db2 怎么查看执行的sql语句需要多少系统临时表空间?
- db2数据库的table表里,一money字段中的数据显示为:56000,00 本人想要用sql语句将它修改为56,000,000
- DB2导出表结构,能不能只导出指定的表结构。求大神指教,给出命令哈
- DB2数据库,增加数据表空间容量需要重启数据库吗?
- cognos连接db2,为什么启动不了服务啊, 连接Oracle可以启动服务。。
- PostgreSQL对比DB2
- db2如何查看编写好的存储过程?
- db2数值截取
- 谁知道关于DB2怎么看系统日志,归档日志的位置。并且怎么修改日志呢?
- db2怎样重组表结构?
- 求一本【牛新庄的DB2运维教程】?
- db2 的 SECADM权限 是干什么的
- DB2怎么删除表空间所以数据