清单 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 DELETE statement are not valid because the
primary key, unique constraint or unique index identified by "1" constrains
table "MELNYK.ORG_TEMP" from having duplicate rows for those columns.
SQLSTATE=23505
|
惟一约束通过防止无意的复制有助于确保数据的完整性。本例中,它防止插入第二条指定 New York 为该组织某部门位置的记录。惟一约束是通过惟一索引来实施的。
“头号人物!” - 主键约束
主键约束(primary key constraint)确保了表中构成主键的一列或一组列的所有值是惟一的。主键用于识别表中的特定行。每个表只能有一个主键,但可以有几个惟一键。主键约束是惟一约束的特例,它是通过主索引来实施的。
必须将主键约束中所引用的列定义为非空(NOT NULL)。可在 CREATE TABLE 语句中使用 PRIMARY KEY 子句(图1和图2)或者在如下的 altER TABLE 语句中定义主键约束。
清单 3. 创建主键约束。EMPLOYEE 表中的 EMPNO 列不能为空,并可在其上定义主键约束。
db2 alter table employee
add primary key (empno)
|
您也可以使用 DB2 Control Center 来定义表上的主键约束(图5)。
图 5. Alter Table 窗口提供了一个方便方式来定义表上的主键约束。从 available columns 的列表中选择一个或多个列并单击按钮以将选中的列名移至 primary key columns 列表中。选中的列必须不可为空。
“都是相关的!” - 外键约束
外键约束(foreign key constraint)有时候称作参照约束。 参照完整性(referential integrity)被定义为“数据库的所有外键值都是有效的状态”。那外键又是什么呢? 外键(foreign key)是指表中的一列或一组列,其值必须至少匹配其父表中一行的一个主键或惟一键值。这真正意味着什么呢?它实际上并非如听起来那般复杂。简单来说,它意味着如果表(T2)中的一列(C2)存在值匹配另一个表(T1)中的一列(C1)的值, 并且 C1 是 T1 的主键,那么 C2 就是 T2 中的外键列。将包含了父键(主键或惟一键)的表称为 父表(parent table),而将包含了外键的表称为 子表(dependent table)。让我们来考虑一个实例。
SAMPLE 数据库中的 PROJECT 表有一个称为 RESPEMP 的列。该列中的值表示负责该表中所列的每个项目的雇员编号。RESPEMP 是不能为空值的。因为该列对应了 EMPLOYEE 表中的 EMPNO 列,并且我们知道 EMPNO 是 EMPLOYEE 表的主键,RESPEMP 就可以定义为 PROJECT 表中的外键(清单 4)。这将确保今后对 EMPLOYEE 表进行的删除不会让 PROJECT 表包含“不存在的”项目负责雇员。
可在 CREATE TABLE 语句中使用 FOREIGN KEY 子句(图 1 和图 2)或者在如下的 altER TABLE 语句中定义外键约束。
清单 4. 创建外键约束。
db2 alter table project
add foreign key (respemp)
references employee on delete cascade
|
REFERENCES 子句指向此参照约束的父表。定义外键约束的语法包括 规则从句(rule-clause),在其中您可以从参照完整性角度告诉 DB2 如何处理 update 或 delete 操作(图1)。
将以标准方式处理 Insert 操作,您不能对其进行控制。参照约束的 插入规则(insert rule) 是指外键的插入值必须匹配其父表中的某个父键值。这是有道理的,并且与上述内容一致。如果向 PROJECT 表插入一条新记录,那么该记录必须包含对 EMPLOYEE 表中一个现有记录的引用(通过父-外键关系)。
参照约束的 更新规则(update rule) 是指 外键(foreign key)的更新值必须匹配其父表中的某个父键值,并且当完成 父键(parent key)上的 update 操作时,所有的外键值必须有匹配的父键值。总的来说,这意味着不能存在任何“孤儿”;每个子表必须有一个父表。
参照约束的 删除规则(delete rule) 是当从父表中删除一行时应用的,并且依赖于在定义参照约束时所指定的选项。如果指定了 RESTRICT 或 NO ACTION 子句,就不能删除任何一行。如果指定了 SET NULL 子句,则会将每个可为空的外键列设置为 null。然而,如果在创建参照约束时指定了 CASCADE 选项,那么 delete 操作将会被传播到父表的各子表上。因为已指定这些子表与父表是 删除关联的(delete-connected)。
下列实例说明了这些观点。
清单 5. 演示了外键约束中的更新规则和删除规则。
db2 update employee set empno = '350' where empno = '000190'
DB20000I The SQL command completed successfully.
db2 update employee set empno = '360' where empno = '000150'
SQL0531N The parent key in a parent row of relationship
"MELNYK.PROJECT.SQL040103212526610" cannot be updated. SQLSTATE=23504
db2 "select respemp from project where respemp < '000050' order by respemp"
RESPEMP
-------
000010
000010
000020
000030
000030
db2 delete from employee where empno = '000010'
DB20000I The SQL command completed successfully.
db2 "select respemp from project where respemp < '000050' order by respemp"
RESPEMP
-------
000020
000030
000030
|
父表(EMPLOYEE)中为“000190”的 EMPNO 值 可以被更改,因为子表(PROJECT)中不存在为“000190”的 RESPEMP 值。然而,对于为“000150”的 EMPNO 值就不是这样的了,它在 PROJECT 表中有匹配的外键值,因而不能被更新。指定了 CASCADE 选项的删除规则确保了当从 EMPLOYEE 表中删除主键值时,删除关联的 PROJECT 表将丢失包含相匹配的外键值的所有记录行。
“检查和再次检查” - 表检查约束
表检查约束(table check constraint)对将要添加到表中的数据实施已定义的限制。例如,一个表检查约束可确保每当在 EMPLOYEE 表中添加或更新电话分机时,雇员的电话分机号码都正好为四位数字。可在 CREATE TABLE 语句中使用 CHECK 子句(图1和图2)或者在如下的 altER TABLE 语句中定义表检查约束。
清单 6. 创建表检查约束。PHONENO_LENGTH 约束确保向 EMPLOYEE 表添加的电话分机正好为四位数字。
db2 alter table employee
add constraint phoneno_length check (length(rtrim(phoneno)) = 4)
|
您也可以使用 DB2 Control Center 来定义表检查约束(图 6)。
图 6. Alter Table 窗口提供了一个方便方式来定义一列上的表检查约束。
单击 Add 按钮以定义新约束(将打开 Add Check Constraint 窗口),或者单击 Change 按钮以修改在列表中选中的现有的约束(图7)。
图 7. Change Check Constraint 窗口让您修改现有的检查条件。
如果表中的现有行包含违反新约束的值,您就不能创建此表检查约束(图 8)。在适当更新了那些不兼容的值之后,您就可以成功添加或修改此约束了。
图 8. 如果新的表检查约束与表中现有的值不兼容,则会返回一条错误。
使用 SET INTEGRITY 语句可以打开或者关闭表检查约束。这将非常有用,例如,当在给表加载大型数据的期间优化性能时。清单 7 呈现了一个简单场景,展示了使用 SET INTEGRITY 语句的一种可能方式。本例中,将雇员“000100”的电话分机更新为 123,然后关闭 EMPLOYEE 表的完整性检查。在 EMPLOYEE 表上定义要求电话分机值为 4 位数字的检查约束。创建名为 EMPL_EXCEPT 的异常表;这个新表的定义是 EMPLOYEE 表的镜像。然后打开完整性检查,而违反检查约束的行将被写入异常表中。对这些表的查询将证实有问题的行现在仅存在于异常表中。
清单 7. 使用 SET INTEGRITY 语句来延迟约束的检查。
db2 update employee set phoneno = '123' where empno = '000100'
db2 set integrity for employee off
db2 alter table employee add constraint phoneno_length check (length(rtrim(phoneno)) = 4)
db2 create table empl_except like employee
db2 set integrity for employee immediate checked for exception in employee use empl_except
SQL3602W Check data processing found constraint violations and moved them to
exception tables. SQLSTATE=01603
db2 select empno, lastname, workdept, phoneno from empl_except
EMPNO LASTNAME WORKDEPT PHONENO
------ --------------- -------- -------
000100 SPENSER E21 123
1 record(s) selected.
|
结束语
我们已经探索了 DB2 Universal Database 所支持的不同类型的约束:非空(NOT NULL)约束、惟一约束、主键约束、外键(参照)约束以及表检查约束。我们展示了 DB2 UDB 是如何使用约束来对数据实施业务规则以及帮助维护数据库完整性的。我们还讲解了如何使用命令行和 DB2 Control Center(和如何查询数据库目录)来有效地管理约束。
分享到:
相关推荐
DB2约束基础是数据库设计中的重要概念,它用于确保数据的完整性和一致性。在DB2中,约束是用来限制表中数据的类型、范围和关系,防止非法数据的插入或更新。下面将详细介绍DB2约束的基础知识,包括其类型、作用以及...
2.由于数据库的限制(例如DB2约束的列不能修改类型,列长度在存在数据的情况下只能改大,等等),生成的脚本仅供参考; 3.尽管经过简单测试,但生成的脚本仍可能有误,或者程序架构、设计难免存在缺陷欢迎提出宝贵...
- **外键**:DB2支持外键约束,但在GreenPlum/PostgreSQL中,外键约束可能会受到分区等因素的影响。 - **唯一约束**:DB2支持在表级或列级定义唯一约束,而在GreenPlum/PostgreSQL中也可以这样做,但实现方式可能略...
DB2是IBM开发的一款关系型数据库管理系统,广泛应用于企业级数据存储和管理。在使用DB2过程中,可能会遇到各种错误,这些错误通常由系统通过错误代码(Error Code)和SQLSTATE来表示。本文将深入解析DB2错误代码大全...
DB2基础知识认证考试(考试代码730)旨在测试考生对于DB2 9版本中的数据类型及其约束条件的理解与应用能力。考试内容涵盖了识别可用的数据类型、约束条件以及在表定义中如何恰当使用这些元素的能力。具体来说,该...
根据提供的标题、描述以及部分文本内容,我们可以整理出与DB2数据库相关的多个知识点。下面将对这些内容进行详细的解析和扩展: ### DB2数据库SQL语句大全 #### 1. 强制关闭所有应用程序 ```sql db2...
1. 表的创建与管理:创建表结构,理解主键、外键、唯一性约束等。 2. 数据插入与查询:使用SQL语句进行数据的插入、更新和删除操作。 3. 视图与存储过程:学习如何创建视图简化查询,以及编写存储过程实现业务逻辑。...
创建表时,需要定义字段名、数据类型、长度和约束条件,如主键、外键和唯一性约束。 2. **SQL支持**:DB2全面支持SQL(结构化查询语言),允许用户进行数据查询、插入、更新和删除操作。此外,还支持复杂的SQL子句...
- 描述表的结构,包括字段名、数据类型和约束。 19. **修改列**:`#db2altertable[tablename]altercolumn[columname]setdatatypevarchar(24)` - 改变指定列的数据类型,此处为将列类型改为VARCHAR(24)。 #### 四...
4. **数据库对象**:QS05_DB2v8_Database.Objects.pdf会介绍DB2中的表、视图、索引、约束、存储过程等数据库对象的创建、修改和删除。理解这些对象的特性和用途,对于设计高效的数据模型非常关键。 5. **JDBC连接**...
删除数据库对象上的约束时,如果该约束还被其他对象引用,DB2将报告+62501518错误。 #### SQL Code +62601529 - 强制删除唯一约束 在尝试强制删除唯一约束时,如果该约束还在被其他数据行依赖,将触发+62601529错误...
- **数据错误**:比如试图插入的数据违反了表的约束条件,如主键约束、唯一性约束或检查约束。 - **连接错误**:网络问题、数据库实例未运行等情况会导致连接错误。 2. **查询SQLCODE**: - 在命令行处理器(DB2...
3. 软件限制:可能包括并发用户数、数据库大小、服务器数量等方面的限制,但“完全无限制”意味着该许可证允许用户在这些方面没有特定的约束。 4. 有效期:某些许可证可能会有时间限制,过了有效期后需要更新或续订...
DB2是一款由IBM开发的关系数据库管理系统,广泛应用于企业级数据存储和管理。SQLCODE是DB2在处理SQL语句时返回的一种错误代码,它用于帮助开发者和管理员理解并解决遇到的问题。本资源“db2 sqlcode大全下载,db2...
当创建索引时指定DEFERRED约束,表示在事务提交前不立即执行约束检查,这可能导致对象处于PENDING状态,直到所有相关事务完成。 以上仅是DB2错误码文档中的一部分示例。理解这些错误码及其背后的含义对于有效管理和...
同时,DB2支持定义非空约束和参考完整性约束,后者在Oracle中并不支持。 #### 八、序列与标识列 在DB2中,序列的使用方式与Oracle完全兼容,可以轻松地在DB2中创建和使用序列。此外,DB2还引入了标识列(identity ...
- '02' 至 '99' 代表各种错误类型,包括数据异常('2')、约束违反('3')、事务处理('4')等。 ### Listing of SQLSTATE values 具体的SQLSTATE值提供了关于SQL语句执行的详细信息。例如: - '42000' 语法或访问规则...
例如,'23505'通常表示违反唯一性约束,而'42601'则表示语法错误。 DB2中,当你遇到一个错误时,系统会返回一个包含SQLCODE(一个整数值)和SQLSTATE的错误消息。SQLCODE是错误的编号,而SQLSTATE则提供了更具体的...
在创建表的语法上,DB2 UDB的CREATE TABLE语句与SQL Server有所不同,提供了更灵活的列定义和约束设置。在Windows环境下,可以通过安装客户端DB2 Connect或服务器端DB2 PE Server + DB2 Connect进行部署。而在RS/...