约束被 DB2 Universal Database(TM)(DB2 UDB)用来对数据实施业务规则。本文描述了下列类型的约束:
您可以在创建一个新表时定义一个或多个 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 窗口提供了一个方便方式来查看表属性。