e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 数据库 >> DB2教程 >> 违背关系誓约 >> 教程正文
 
教程搜索
 
 
相关教程
  • 数据挖掘器: 警告 — 及时采取行动
  • UNIX、Linux 和 Windows 的生动简介
  • “总览图”: IBM DB2 通用数据库和信息
  • DB2 大事记
  • 数据管理部门副总裁兼 CTO:Don Hader
  • IBM 联邦数据库技术
  • 唐纳德.海德勒(Donald J. Haderle)
  • 数据库未来展望
  • 哪一个分布式 DB2 UDB V8 版本适合您?
  • 从数据管理到信息集成: 自然的演变
  • 联邦 - 数据库互操作性(第 1 部分)
  • 成功是必然的(中)
  • 成功是必然的(上)
  • 成功是必然的(下)
  • DB2 信息集成: 总览图
  • IBM 杰出工程师兼信息集成主管 Nelson
 
 

图文教程


  • Windows抢了谁的饭碗 非主流操作系统To

  • 地球还是火星 平常心看“非主流”

  • 综合运用Office 2007批量制作奖状

  • 没有系统盘如何才能修复受损系统?

  • 巧妙运用Excel中边界的附加功能!
 
 
赞 助 商
 
 
违背关系誓约
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2007-8-9
一个名为 GENERATE_UNIQUE 的函数。这个函数将节点号(用于多分区数据库)与时间戳记结合,因此它可以与企业扩展版本(EEE)一起使用。IDENTITY 和 SEQUENCE 在 DB2 的下一个主要版本出现前还不能与 EEE 一起使用。GENERATE_UNIQUE 有两个缺点:数据类型(CHAR(13) FOR BIT DATA)不是按顺序递增,并且不象数值数据类型那样易于使用。


更简单的解决方案是标量子查询表达式:

INSERT INTO Foobar (key_col, ...)

VALUES (COALESCE((SELECT MAX(key_col) FROM Foobar) +1, 0) ...)

获得一屏数据

这些方法对于那些在数据库和应用程序投入生产以前有机会进行一些设计工作的模式和应用程序来说是不错的。但您还记得那两个以 A(ARIES(航班订票环境仿真)和 ACID(原子性、一致性、隔离和持久性))开头的 4.5 字母单词吗?如果您预定了航班,那么您希望他们在您到达机场时记得这回事。这就是持久性:有用的数据是持久的。这意味着即使您定义了一个好的主键,有些人可能会查询结果集的“前二十行”,而不管结果集中有多少行。更糟的情况是有人要求您显示第 21 行到 40 行。但等一下,您会提出异议,关系表中的行没有顺序!对于希望在他们的 Netscape 浏览器中一次看到二十行的用户而言,您就好象在说冰岛语。DB2 允许您实时地给结果集排序,并可以从该结果集的开始或结尾部分提取任意数量的行:

SELECT NAME FROM ADDRESS

ORDER BY NAME

FETCH FIRST 10 ROWS ONLY SELECT NAME FROM ADDRESS

ORDER BY NAME DESC

FETCH FIRST 10 ROWS ONLY

ORDER BY 将强制在内存中对整个结果集进行排序,所以,为了提高 DB2 服务器性能,我们不这么做(尽管只向客户机发送 10 行可能会提高网络性能)。如果您不关心顺序并且只想知道至少有 10 行符合结果集,则清除 ORDER BY 以省去 DB2 服务器上的排序:

SELECT NAME FROM ADDRESS

FETCH FIRST 10 ROWS ONLY

于是现在我们已看到您给行编号并且任意选择了一个子集。假设我们因某些性能上的好处而给行编号,这必将破坏关系模型。我们几乎完全妥协了,并且已经犯了关系七宗罪中的六宗。还有一条关系誓约您没有触犯:让我们实时地给行编号,牺牲掉性能和关系纯洁性吧。我们如何证明这样做的正确性呢?在因特网上谴责它吧。

向使用浏览器的客户显示公司数据显然证明了违背对关系纯洁性和性能推崇所作的承诺。您可以用 rownum 或 rank 函数实时地给结果集赋予行号。下面我们为用来记录地址的表中的行排序,并选择第 11 行到第 20 行。结果集由名称和实时创建的名为 rn 的列(它给行编号)组成:

SELECT * FROM (SELECT NAME, rownumber() OVER

(ORDER BY NAME)

AS rn FROM ADDRESS)

AS tr WHERE rn BETWEEN 11 and 20


rank 更为复杂,并且它允许您以排序的顺序标识联系,对于足球联赛非常理想:

create table football (team char(10), points int)

insert into football values ('United', 20)

insert into football values ('Arsenal', 20)

insert into football values ('Liverpool', 10) select rank() over

(order by points desc) as place,

team, points

from football PLACE TEAM POINTS 1 United 20 1 Arsenal 20 3 Liverpool 10

清空表 — 无需通知日志记录程序(截断表)

现在你已经得到了很多精巧的方法来处理你的数据了,我们再来学习一个小把戏。其他的数据库产品有被称为“截断表”的功能,即在不进行日志记录的情况下删除表中的所有数据,而保留表的结构(如果不想保留表结构,我们就使用 DROP TABLE 命令了)。如果想在 DB2 中得到这种功能,可以执行带有 REPLACE 选项的 LOAD 命令,并使用一个 0 字节的文件作为导入数据源,由于 DB2 的 LOAD 操作是不做日志的,所以可以通过这个小骗局来达到我们的目的。

猜测游戏和镜屋

您的表很不错 — 为什么要从视图访问它?这样做有许多理由:

  • 列级别安全性:排除那些您不希望用户在定义视图的 SELECT 中看到的列。

  • 行级别安全性:除非您定义一个视图,否则 Windows/UNIX/OS/2 上的 DB2 v7 不允许您限制对表中某些行的访问(如果您希望限制对允许用户看到的内容的更新,请记得加上 check 选项): create view london_football as

    select * from football

    where team in ('Arsenal','Aston Villa')

    with check option

    设想这一点对于“人力资源”应用程序的作用:用户可以查看薪水在 $nn,nnn 以下的雇员,给他们加薪而加薪后的薪水不会在 $nn,nnn 以上。

  • DROP COLUMN:DB2 不允许您删除一个列。我可以想到您希望删除列的三个理由:
    • 回收空间:如果您希望这样做,可以导出您希望保存的数据,删除那个表,用您需要的那些列重新创建表,然后装入这个表。这是否代价高昂?当然是,但是回收空间需要这样或者 REORG TABLE。这些本来就是代价高昂的操作。


    • 这个列不再是行的逻辑部分:例如,您意识到您的雇员可能有两个地址,并且停止跟踪雇员(employee)表中的地址(雇员表和雇员地址(employee_address)表之间现在有 n:m 关系)。在雇员表上创建一个不包含地址列的视图。

      如果您真的要用新奇的方法,可以使用 RENAME TABLE 命令给基表一个新的名称,然后将原始表名作为该视图的名称。您的视图也可以连接雇员表中的有用列和从雇员地址获得的地址。现在我们回到了关系的正道。

    • 列变宽了。如果它是 VARCHAR,那您运气不错。DB2 允许您将 VARCHAR 列最多加宽至表空间(tablespace)中定义的页大小宽度(缺省的 4K 页大小为 4,005,而在 32K 页上最多为 32,672): create table t2 (col1 varchar(10))

      alter table t2 alter column col1 set data type varchar(12)

我很喜欢这个视图,所以我实现它

如果派生列对您来说还不够坏,整个派生表怎么样?使它与基表中的数据匹配或不匹配(以及使每个 SELECT 成为潜在的错读)的能力又如何?Oracle 称这些为实现的视图。DB2 称它们为自动汇总表,在特殊情况下称为复制汇总表。如果经常被问到一个问题(SELECT MAX(ORDERS) FROM LEADS),或者经常组装一个聚集(SELECT COUNT(FRANCHISES) FROM STORES WHERE STATE=’TEXAS’),那么或许值得将结果集存储在磁盘上,这样 DB2 就不必每天重新计算它二十次:特别当几天前的数据足以准确地支持基于查询的决策时。

让我们从想知道哪个客户订购最多的贪婪的销售经理开始。他们在名为 LEADS 的表中跟踪这一项,推断出客户过去所下订单的数目可能有助于确定哪些销售线索最有可能变为真实的销售。这个问题每天会被问几次(如果您预感这正在发生并且需要验证它,您可以使用名为 Query Patroller 的 DB2 工具查看来自用户的查询)。SELECT MAX() 通常需要一个表扫描,这会强制 DB2 查看表中的每一行。如果您有许多线索,则需要扫描许多行才能找到一个值。定义一个汇总表允许 DB2 将这个值存储在磁盘上,这样 DB2 只用读一行就可以得到答案:

create summary table leads_max

(MAX_ORDERS) as (SELECT MAX(ORDERS) FROM LEADS )

DATA INITIALLY DEFERRED

REFRESH DEFERRED

创建汇总表后,用这条命令填充它:

REFRESH TABLE LEADS_MAX

用户不必

上一页  1 2 3 下一页
  • 上一篇教程: 使用 DB2 v7.2 中的 SQL UDF 扩大递归机会
  • 下一篇教程: 复合 SQL 与错误报告
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.