|
中华网络安全联盟 作者:佚名 来源:网络转载 时间:2006-3-23
约束被 DB2 Universal Database(TM)(DB2 UDB)用来对数据实施业务规则。本文描述了下列类型的约束:
- 非空(NOT NULL)
- 惟一
- 主键
- 外键
- 表检查
此外,还有另一种名为 信息约束(informational constraint)的约束。与上面所列的这五种约束类型不同的是,信息约束不是由数据库管理器实施的,但是 SQL 编译器可用它来提高查询性能。在这篇文章中,我将只关注上面所列的这几类约束,而不会讨论信息约束。
您可以在创建一个新表时定义一个或多个 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 窗口提供了一个方便方式来查看表属性。
|