介绍DB2数据库的约束(1)

发表于:2007-07-13来源:作者:点击数: 标签:
约束被 DB2 Universal Database(TM)(DB2 UDB)用来对数据实施业务规则。本文描述了下列类型的约束: 非空(NOT NULL) 惟一 主键 外键 表检查 此外,还有另一种名为 信息约束(informational constraint) 的约束。与上面所列的这五种约束类型不同的是,信

约束被 DB2 Universal Database(TM)(DB2 UDB)用来对数据实施业务规则。本文描述了下列类型的约束:

  • 非空(NOT NULL)
  • 惟一
  • 主键
  • 外键
  • 表检查
此外,还有另一种名为 信息约束(informational constraint)的约束。与上面所列的这五种约束类型不同的是,信息约束不是由数据库管理器实施的,但是 SQL 编译器可用它来提高查询性能。在这篇文章中,我将只关注上面所列的这几类约束,而不会讨论信息约束。

您可以在创建一个新表时定义一个或多个 DB2 UDB 约束,也可以稍后通过更改表来定义它们。CREATE TABLE 语句是十分复杂的;所以尽管实际上其选项中只有一小部分是用于定义约束的,但是当在语法图(图1和 图2)中进行查看时,那些选项本身看上去就相当复杂。通过 DB2 Control Center 可使约束管理更简单、方便。

图 1. CREATE TABLE 语句的部分语法,显示了用于定义约束的子句

图 1

约束定义与它们所应用的数据库相关联,并存储在数据库目录中(表1)。您可以查询数据库目录来检索并查看该信息。您可以从命令行直接进行(请记住要首先建立数据库连接),同样,您会发现通过 Control Center 来访问这些信息会更方便。

可将所创建的约束像对待其他数据库对象一样进行处理。它们具有名称和关联模式(creator ID),并且在有些情况下还能被撤销(删除)。

图 2. CREATE TABLE 语句的部分语法,显示了用于定义约束的子句(续)

图 2

表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 模式上筛选的。

图 3

DB2 Control Center 让您方便地访问诸如表这样的数据库对象。图 3 显示了 SAMPLE 数据库中的用户表。当在对象树中选中 Tables 时,它们就会出现在其内容窗格中。如果选择 EMPLOYEE 表,我们可以打开 Alter Table 窗口来查看表定义,包括列属性(图 4)。

图 4. Alter Table 窗口提供了一个方便方式来查看表属性。

图 4



  

原文转自:http://www.ltesting.net