`

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
分享到:
评论

相关推荐

    DB2 Express-C 快速入门书籍

    - **表(Table)**:存储数据的基本结构,了解表的创建和管理对于使用DB2进行数据存储至关重要。 - **数据类型(Data Types)**:表中字段可以存储的数据类型。 - **标识列(Identity Columns)**和**序列对象...

    DB2 Express-C 快速入门.zip

    例如,使用`CREATE DATABASE`语句创建新的数据库,`CREATE TABLE`定义表结构,`INSERT INTO`添加数据,`UPDATE`修改数据,而`SELECT`则用于检索数据。对于更复杂的查询,可以利用JOIN操作连接多个表,或者使用子查询...

    DB2 Express-C快速入门

    在DB2中,数据库是数据的逻辑容器,由多个表组成。创建数据库通常涉及指定数据库名称、大小、存储位置等参数。你可以使用命令行工具db2admin或图形界面工具如DB2 Control Center或IBM Data Studio来完成这个任务。 ...

    深入解析DB2--高级管理,内部体系结构与诊断案例.7z.003

    深入解析DB2--高级管理,内部体系结构与诊断案例.7z.003

    db2jcc-1.0.jar

    db2jcc-1.0.jar

    深入解析DB2--高级管理,内部体系结构与诊断案例02

    《深入解析DB2--高级管理,内部体系结构与诊断案例》 《循序渐进DB2.DBA系统管理、运维与应用案例》 这个资源是第三本《循序渐进DB2.DBA系统管理、运维与应用案例》,此三本书,我会全部上传的,又喜欢DB2的兄弟们下...

    DB2高可用性实例配置(db2haicu--TSA)

    ### DB2高可用性实例配置(db2haicu--TSA) #### 一、核心概念与背景 **DB2高可用性(HA)**是指在IBM DB2 for Linux, UNIX中利用一系列技术来确保数据库服务的连续性。当发生硬件故障、软件异常或网络中断时,能够...

    DB2 基础---DB2进程

    DB2是IBM开发的一款关系型数据库管理系统,广泛应用于企业级数据存储和管理。在DB2系统中,进程扮演着至关重要的角色,它们是系统运行的基础,负责执行SQL语句、管理内存、处理并发请求以及与操作系统进行交互。下面...

    DB2基础----表空间

    在DB2中,表空间(Tablespace)是数据存储的基本单位,它将物理磁盘上的存储资源组织起来,为数据库对象(如表、索引等)提供逻辑存储空间。本篇文章将深入探讨DB2中的表空间概念、类型、创建以及管理方法。 一、表...

    db2中有表损坏时最快的恢复方法db2look-move

    当遇到如DB2这样的数据库系统中的表损坏问题时,如何快速有效地恢复,成为了DBA(数据库管理员)和运维人员关注的重点。本文将详细阐述使用“db2look-move”方法进行DB2表损坏快速恢复的步骤与原理,帮助读者理解并...

    db2驱动(db2jcc-1.4.2.jar+db2jcc_license_cu-1.4.2.jar)

    DB2 JDBC驱动是IBM为DB2数据库提供的JDBC实现,它允许Java应用程序通过网络与DB2数据库建立连接、执行SQL语句以及处理结果集。 2. **db2jcc-1.4.2.jar**:这是DB2 JDBC类型4驱动的主要组件,类型4驱动是一种纯Java...

    图解DB2 Express-C 9.5在Windows下的安装.doc

    图解 DB2 Express-C 9.5 在 Windows下的安装 DB2 Express-C 9.5 是 IBM 公司推出的免费数据库管理系统,适合中小型企业和个人使用。下面是 DB2 Express-C 9.5 在 Windows 下的安装步骤: 一、下载安装源 首先需要...

    PyPI 官网下载 | db2table-0.2.0-py3-none-any.whl

    安装完成后,就可以在Python环境中导入db2table库,然后连接到你的DB2数据库,执行SQL查询并将结果转换为DataFrame: ```python import db2table # 假设已配置好数据库连接参数 connection = db2table.connect('...

    db2-正则表达式.zip

    1- Save attached db2_regex.zip file to a new folder on the hard disk for example to C:\avalanche 2- Extract all files from the zip file to C:\avalanche\db2_regex 3- Open C:\avalanche\db2_regex\...

    DB2--302认证考题真题及参考答案【全】

    DB2--302认证考题真题及参考答案【全】

    DB2-CLIENT-Sat Jan 30 11_48_21 2010.log

    DB2DB2-CLIENT-Sat Jan 30 11_48_21 2010.log Test sourse

    DB2jdbc-4.23.42.zip

    DB2 JDBC驱动是这个过程中的关键组件,它提供了一个中间层,使得Java应用程序能够与DB2数据库无缝交互。 DB2 JDBC驱动程序分为四种类型:Type 1、Type 2、Type 3 和 Type 4。"DB2jdbc-4.23.42.zip" 中的 "4" 暗示这...

    db2express-c-docker:构建 DB2 Express-C Docker 镜像

    用于 Docker 的 IBM DB2 Express-C 映像 这是 Dockerfiles 和 IBM DB2 Express-C 脚本的 Git 存储库,由 IBM Analytics Emerging Technology 团队维护。 此目录中的 Dockerfile 用于在上构建DB2 Express-C映像 用法...

Global site tag (gtag.js) - Google Analytics