DB2 Information Development,IBM Canada Ltd.
2004 年 3 月
约束被 DB2 UDB 用来对数据实施业务规则以及帮助维护数据库完整性。本文描述了 DB2 UDB 所支持的不同类型的约束并且提供了每种约束类型的实例。此外,作者还讲述了约束管理的基础知识(使用命令行或 DB2 Control Center)。
约束被 DB2 Universal Database(TM)(DB2 UDB)用来对数据实施业务规则。本文描述了下列类型的约束:
- 非空(NOT NULL)
- 惟一
- 主键
- 外键
- 表检查
您可以在创建一个新表时定义一个或多个 DB2 UDB 约束,也可以稍后通过更改表来定义它们。CREATE TABLE 语句是十分复杂的;所以尽管实际上其选项中只有一小部分是用于定义约束的,但是当在语法图( 图 1和 图 2)中进行查看时,那些选项本身看上去就相当复杂。通过 DB2 Control Center 可使约束管理更简单、方便。
图 1. CREATE TABLE 语句的部分语法,显示了用于定义约束的子句约束定义与它们所应用的数据库相关联,并存储在数据库目录中( 表 1)。您可以查询数据库目录来检索并查看该信息。您可以从命令行直接进行(请记住要首先建立数据库连接),同样,您会发现通过 Control Center 来访问这些信息会更方便。
可将所创建的约束像对待其他数据库对象一样进行处理。它们具有名称和关联模式(creator ID),并且在有些情况下还能被撤销(删除)。
图 2. CREATE TABLE 语句的部分语法,显示了用于定义约束的子句(续) 表 1. 数据库目录中的约束信息。要运行成功,对目录的查询需要建立数据库连接。 目录视图 视图列 描述 查询实例 SYSCAT.CHECKS 为每个表检查约束包含一行记录 db2 select constname, tabname, text from syscat.checks SYSCAT.COLCHECKS 为表检查约束所引用的每一列包含一行记录 db2 select constname, tabname, colname, usage from syscat.colchecks SYSCAT.COLUMNS NULLS 指明一列是可为空(Y)还是不可为空(N) db2 select tabname, colname, nulls from syscat.columns where tabschema = 'MELNYK' and nulls = 'N' SYSCAT.CONSTDEP 为某些其他对象上的约束的每个依赖性包含一行记录 db2 select constname, tabname, btype, bname from syscat.constdep SYSCAT.INDEXES 为每个索引包含一行记录 db2 select tabname, uniquerule, made_unique, system_required from syscat.indexes where tabschema = 'MELNYK' SYSCAT.KEYCOLUSE 为惟一、主键或外键约束定义的键中所包含的每个列包含一行记录 db2 select constname, tabname, colname, colseq from syscat.keycoluse SYSCAT.REFERENCES 为每个参照约束包含一行记录 db2 select constname, tabname, refkeyname, reftabname, colcount, deleterule, updaterule from syscat.references SYSCAT.TABCONST 为每个惟一(U)、主键(P)、外键(F)或表检查(K)约束包含一行记录 db2 select constname, tabname, type from syscat.tabconst SYSCAT.TABLES PARENTS 该表的父表数目(该表在其中充当子表的参照约束数目) db2 "select tabname, parents from syscat.tables where parents > 0" SYSCAT.TABLES CHILDREN 该表的子表数目(该表在其中充当父表的参照约束数目) db2 "select tabname, children from syscat.tables where children > 0" SYSCAT.TABLES SELFREFS 该表的自引用参照约束数目(该表在其中既充当父表又充当子表的参照约束数目) db2 "select tabname, selfrefs from syscat.tables where selfrefs > 0" SYSCAT.TABLES KEYUNIQUE 在该表上所定义的惟一约束(除了主键)的数目 db2 "select tabname, keyunique from syscat.tables where keyunique > 0" SYSCAT.TABLES CHECKCOUNT 在该表上所定义的检查约束的数目 db2 "select tabname, checkcount from syscat.tables where checkcount > 0" “不能为空值!” - 非空约束 非空约束(NOT NULL constraint)防止向一列添加空值。这就确保了该列在表中每一行都存在一个有意义的值。例如,SAMPLE 数据库中 EMPLOYEE 表的定义包括LASTNAME VARCHAR(15) NOT NULL ,这就确保每行都将包含一个雇员的姓。 要判断一列是否可为空,您可以查阅该表的数据定义语言(DDL)(可通过调用 db2look 工具来生成);您也可以使用 DB2 Control Center( 图 3和 图 4);或者您还可以查询数据库目录( 清单 1)。 图 3. DB2 Control Center 的内容窗格中显示了在其对象树中选中的关联了特定数据库的表。该列表是在 melnyk 模式上筛选的。
DB2 Control Center 让您方便地访问诸如表这样的数据库对象。图 3 显示了 SAMPLE 数据库中的用户表。当在对象树中选中 Tables 时,它们就会出现在其内容窗格中。如果选择 EMPLOYEE 表,我们可以打开 Alter Table 窗口来查看表定义,包括列属性(图 4)。
图 4. Alter Table 窗口提供了一个方便方式来查看表属性。 清单 1. 查询数据库目录以判断哪些数据库列可为空
db2 select tabname, colname, nulls from syscat.columns where tabschema = 'MELNYK' and nulls = 'N'
“仅单独存在” - 惟一约束
惟一约束(unique constraint)防止一个值在表中的特定列里出现不止一次。它还防止一组值在特定的一组列里出现不止一次。必须将惟一约束中所引用的列定义为非空(NOT NULL)。可在 CREATE TABLE 语句中使用 UNIQUE 子句(图 1 和 图 2)或者在如下的 altER TABLE 语句中定义惟一约束。
清单 2. 创建惟一约束。除了 ORG_TEMP 中的 LOCATION 列不能为空且在其上定义了惟一约束之外,ORG_TEMP 表与 SAMPLE 数据库中的 ORG 表是相同的。
db2 create table org_temp ( deptnumb smallint not null, deptname varchar(14), manager smallint, division varchar(10), location varchar(13) not null) db2 alter table org_temp add unique (location) db2 insert into org_temp values (10, 'Head Office', 160, 'Corporate', ' New York') DB20000I The SQL command completed successfully. db2 insert into org_temp values (15, 'New England', 50, 'Eastern', ' New York') SQL0803N One or more values in the INSERT statement, UPDATE statement, or foreign key update caused by a DELET
上一篇教程: DB2 中的用户定义聚合函数
下一篇教程: Informix Dynamic Server 中的 SQL 语句缓存






