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 empk select empno,lastname,salary from employee order by salary desc fetch first 5 rows only db2 => select * from empk EMPNO ENAME SALARY ------ --------------- ----------- 000010 HAAS 152750.00 000030 KWAN 98250.00 000070 PULASKI 96170.00 000020 THOMPSON 94250.00 000090 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.00 2、New Table new 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 * from new table(insert into empk select empno,lastname,salary from employee order by salary asc fetch first 3 rows only) EMPNO ENAME SALARY ------ --------------- ----------- 200340 ALONZO 31840.00 000290 PARKER 35340.00 200330 WONG 35370.00 此時的表中數據為: db2 => select * from empk EMPNO ENAME SALARY ------ --------------- ----------- 000010 HAAS 152750.00 000030 KWAN 98250.00 000070 PULASKI 96170.00 000020 THOMPSON 94250.00 000050 yeeXun 80000.00 200340 ALONZO 31840.00 000290 PARKER 35340.00 200330 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.00 000290 PARKER 42408.00 200330 WONG 42444.00 3、Inlcude 如果我們在更新一條數據的同時,想同時查看舊數據(更新之前)和新數據(更新之後), 根據上面講到的new table和old table,我們可以使用兩個語句查看,如: select salary from old table(update empk set salary=salary*1.1 where empno='200330') union all select salary from new table(update empk set salary=salary*1.1 where empno='200330') 然而,當執行此語句的時候,我們會得到如下的錯誤信息: SQL20165N 在指定 SQL 數據更改語句的上下文中,不允許 FROM 子句中的 SQL數據更改語句。SQLSTATE=428FL include關鍵詞可以解決此問題,在更新數據的時候,可以同時把新舊數據查詢出來,下面是實例: select empno,salary as new_salary,old_salary from new table( update empk include(old_salary decimal(9,2)) set salary=salary*1.1, old_salary=salary where empno='200330') EMPNO NEW_SALARY OLD_SALARY ------ ----------- ----------- 200330 46688.40 42444.00 1 條記錄已選擇。 表中的數據也是如此: db2 => select * from empk where empno='200330' EMPNO ENAME SALARY ------ --------------- ----------- 200330 WONG 46688.40 1 條記錄已選擇。 4、Final Table final table“存儲”數據修改操作、引用完整性操作和觸發器操作之後的數據, 它可以用來檢查在執行insert,update或者delete的時候, 被操作的數據是否存在觸發器或者引用約束,此時final table關鍵詞會導致這些操作停止。 如下面這個例子中,我們創建一個觸發器,給新增員工增加10%的工資。 create trigger trig_empk after insert on empk referencing new as n for each row mode db2sql update empk set salary=n.salary*1.1 where 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=560C3 db2 => select count(*) from empk where empno='120821' 1 ----------- 0 1 條記錄已選擇。 添加數據時候,使用new table查看新的值,這個值是未經過任何觸發器或者約束修改過的。 db2 => select * from new table(insert into empk values('120821','ChenLinBo',50000)) EMPNO ENAME SALARY ------ --------------- ----------- 120821 ChenLinBo 50000.00 --★ 1 條記錄已選擇。 db2 => select * from empk where empno='120821' EMPNO ENAME SALARY ------ --------------- ----------- 120821 ChenLinBo 55000.00 --★ 1 條記錄已選擇。 5、Final Table和New Table的區別★ 他們都同樣的返回update或insert的中間結果數據,但是Final Table能確保對目標表的update和insert操作, 沒有觸發器或者應用完整性約束的後續數據修改,如上面這個例子。 來源 http://blog.csdn.net/bobo12082119/article/details/8775600