在商界,我们的确通常 或者想要某些事件有计划地
|
需要确保始终实施某些规则。例 发生。例如,如果销售员售出一
|
如,参与项目的雇员必须被雇用。 批商品,则应增加其佣金。
|
DB2 通用数据库为此提 重复值的规则。 参考完整 件,它们定义为表定义的一 这些操作通过对指定的表进 、修改输入值以及发布警报
|
供了一套有用的方法。 唯一约 性约束确保在整个指定的表中数 部分,限制一列或多列中使用的 行删除、插入或更新操作来执行 信息。
|
束是禁止在表的一列或多列中出现 据一致性。 表检查约束是一些条 值。触发器允许您定义一组操作, 或触发。触发器可用于写入其他表
|
第一节提供关键字的概 及触发器。
|
念性概述。接着,通过示例和图
|
表进一步探讨参考完整性、约束以
|
由不止一列组成的关键字称为组合关 的排序不受这些列在表中排序的约束。
|
键字。在具有组合关键字的表中,组合关键字中各列
|
唯一关键字被定义为它的任何值都不 INSERT 和 UPDATE 语句期间,数据库管 字。唯一关键字是可选的,并且可在 CRE
|
相同。唯一关键字的列不能包含空值。在执行 理程序强制执行该约束。一个表可以有多个唯一关键 ATE TABLE 或 ALTER TABLE 语句中定义。
|
主关键字是一种唯一关 字的列不能包含空值。主关 定义。
|
键字,表定义的一部分。一个表 键字是可选的,并且可在 CREAT
|
不能有多个主关键字,并且主关键 E TABLE 或 ALTER TABLE 语句中
|
外部关键字在参考约束的定义中指定 部关键字的值的任何部分为空,则该值为 语句或 ALTER TABLE 语句中定义。
|
。一个表可以有零个或多个外部关键字。如果组合外 空。外部关键字是可选的,并且可在 CREATE TABLE
|
唯一约束确保关键字的 PRIMARY KEY 或 UNIQUE 子 ,可在一个表的雇员编号列
|
值在表中是唯一的。唯一约束是 句的 CREATE TABLE 或 ALTER T 上定义一个唯一约束,以确保每
|
可选的,并且可以通过使用指定 ABLE 语句来定义唯一约束。例如 个雇员有唯一的编号。
|
通过定义唯一约束和外 唯一关键和外部关键字约束 为父关键字。外部关键字表 规定每个雇员(EMPLOYEE EMPLOYEE 表中的“部门号 主关键字。下列图表提供参
|
部关键字,可以定义表与表之间 的组合通常称为参考完整性约束 示特定的父关键字,或与特定的 表)必须属于某现存的部门(DE ”定义为外部关键字,而将 DEP 考完整性约束的直观说明。
|
的关系,从而实施某些商业规则。 。外部关键字所引用的唯一约束称 父关键字相关。例如,某规则可能 PARTMENT 表)。因此,将 ARTMENT 表中的“部门号”定义为
|
表检查约束指定对于表 CREATE 或 ALTER TABLE 语
|
的每行都要进行判定的条件。可 句添加检查约束。
|
对个别列指定检查约束。可使用
|
| 雇员的职务只能为下列之一: "Sales"、"Mgr"或"Clerk" |
| 1986 年之前雇用的每个雇员的工资必须超过 ,500。 |
DEPT SMALLIN
|
T CHECK (DEPT BETWEEN 10 AND 100),
|
JOB
|
CHAR(5) CHECK (JOB IN
|
(’Sales’, ’Mgr’, ’Clerk’)),
|
| CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) >= 1986 OR SALARY > 40500) ) |
仅当条件判定为假时才 而不出错,尽管 DEPT 的值
|
会违反约束。例如,如果插入行 应该象约束中定义的那样在 10
|
的 DEPT 为空值,则插入继续进行 和 100 之间。
|
下列语句将一个约束添加至名为 COM 过 ,000:
|
P 的 EMPLOYEE 表中,该约束为雇员的总报酬必须超
|
| ADD CONSTRAINT COMP CHECK (SALARY + COMM > 15000) |
将检查表中现存的行以 语句将此检查延期:
|
确保这些行不违反新约束。可通
|
过使用如下的 SET CONSTRAINTS
|
| SET CONSTRAINTS FOR EMP OFF |
| ALTER TABLE EMP ADD CONSTRAINT COMP CHECK (SALARY + COMM > 15000) |
SET CONSTRAINTS
|
FOR EMP IMMEDIATE CHECKED
|
首先使用 SET CONSTRAINTS 语句以 至表而不检查这些约束。接着再次发出 S 行任何延期的约束检查。
|
延期对表的约束检查。然后可将一个或多个约束添加 ET CONSTRAINTS 语句,反过来将约束检查打开并执
|
| 一个触发器定义一组操作,这组操作通过修改指定基表中数据的操作来激活。 |
可使用触发器来执行对 他表;为了审查跟踪而写入 序开发及商业规则的全面实
|
输入数据的验证;自动生成新插 其他表;或通过电子邮件信息支 施更快速并且应用程序和数据的
|
入行的值;为了交叉引用而读取其 持警报。使用触发器将导致应用程 维护更容易。
|
DB2 通用数据库支持几种类型的触发 作之前或之后激活。每个触发器包括一组 选的搜索条件。
|
器。可定义触发器在 DELETE、INSERT 或 UPDATE 操 称为触发操作的 SQL 语句,这组语句可包括一个可
|
可进一步定义后触发器 发器总是对每一行都执行触
|
以对每一行都执行触发操作,或 发操作。
|
对语句执行一次触发操作,而前触
|
在 INSERT、UPDATE 或 条件,或在将输入值存储在 其他任务,如发送信息等,
|
DELETE 语句之前使用触发器, 表中之前更改输入值。使用后触 这些任务可能是触发器操作所要
|
以便在执行触发操作之前检查某些 发器,以便在必要时传播值或执行 求的。
|
下列示例说明了前触发器和后触发器 序。该数据库包含两个表,CURRENTQUOTE
|
的使用。考虑一个记录并跟踪股票价格波动的应用程 和 QUOTEHISTORY,定义如下:
|
| CREATE TABLE CURRENTQUOTE |
| CREATE TABLE QUOTEHISTORY |
| 当使用如下语句更新 CURRENTQUOTE 的 QUOTE 列时: |
| 应更新 CURRENTQUOTE 的 STATUS 列以反映股票是否: |
| CREATE TRIGGER STOCK_STATUS |
NO CASCADE B
|
EFORE UPDATE OF QUOTE ON CUR
|
RENTQUOTE
|
REFERENCING NEW AS NEWQU
|
OTE OLD AS OLDQUOTE
|
WHERE
|
SYMBOL = NEWQUOTE.SYMBOL
|
AND YE
|
AR(TIMESTAMP) = YEAR(CURRENT DATE) )
|
|
WHERE SYMBOL = NEWQUOT
|
E.SYMBOL
|
|
AND YEAR(TIMESTAMP) =
|
YEAR(CURRENT DATE) )
|
| WHEN NEWQUOTE.QUOTE > OLDQUOTE.QUOTE |
| WHEN NEWQUOTE.QUOTE < OLDQUOTE.QUOTE |
WHEN NEWQU
|
OTE.QUOTE = OLDQUOTE.QUOTE
|
此代码块将名为 STOCK QUOTE 列之前激活的触发器 改应用于数据库之前,要应 。第三行指定一些名称,必 (OLDQUOTE)。用这些相关名 应对每一行都执行触发操作
|
_STATUS 的触发器定义为一个应 。第二行指定,在将 CURRENTQU 用触发操作。第二行也意味着触 须将这些名称作为列名的限定符 (NEWQUOTE 和 OLDQUOTE)限定 。
|
该在更新 CURRENTQUOTE 表的 OTE 表的实际更新所引起的任何更 发操作将不会激活任何其他触发器 用于新值 (NEWQUOTE) 和旧值 的列名称为转换变量。第四行表示
|
这标记此触发器的触发 句在一个触发器中用来将值 语句正将一个值赋给 CURRE
|
操作中第一个也是唯一的一个 S 赋给表的行中的列,该表正在由 NTQUOTE 表的 STATUS 列。
|
QL 语句的开始。 SET 转换变量语 激活该触发器的语句进行更新。此
|
该赋值语句右边使用的表达式为 CAS
|
E 表达式。 CASE 表达式扩充为 END 关键字。
|
第一种情况检查新报价 子查询正在使用由跟在后面
|
(NEWQUOTE.QUOTE) 是否超过当 的后触发器更新的 QUOTEHISTOR
|
前日历年度中股票符号的最高价。 Y 表。
|
第二种情况检查新报价 (NEWQUOTE.Q 子查询正在使用由跟在后面的后触发器更
|
UOTE) 是否小于当前日历年度中股票符号的最低价。 新的 QUOTEHISTORY 表。
|
最后三种情况将新报价 定新报价是大于、小于还是
|
(NEWQUOTE.QUOTE) 与表 (OLDQ 等于旧报价。 SET 转换变量语
|
UOTE.QUOTE) 中的报价比较,以确 句在此处结束。
|
除了更新 CURRENTQUOT QUOTEHISTORY 表中来创建
|
E 表中的项之外,还需要通过将 一个审查记录。这通过使用下列
|
新报价连同时间戳记一起复制到 后触发器来实现:
|
| CREATE TRIGGER RECORD_HISTORY |
AFTER UPDATE OF QUOTE ON CU
|
RRENTQUOTE
|
| REFERENCING NEW AS NEWQUOTE |
VALUES (NEWQ
|
UOTE.SYMBOL, NEWQUOTE.QUOTE,
|
CURRENT TIMESTAMP);
|
此代码块将命名为 RECORD_HISTORY QUOTE 列之后激活的触发器。第三行指定 。第四行表示应对每一行都执行触发操作
|
的触发器定义为应该在更新 CURRENTQUOTE 表的 应该作为列名的限定符用于新值 (NEWQUOTE) 的名称 。
|
此触发器的触发操作包括单个 SQL NEWQUOTE.SYMBOL 和 NEWQUOTE.QUOTE)
|
语句,该语句使用已更新的行中的数据( 和当前的时间戳记将该行插入 QUOTEHISTORY 表。
|
CURRENT TIMESTAMP 是
|
包含时间戳记的专用寄存器。专
|
用寄存器中提供了列表和解释。
|
|