购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 完整性约束

2.2.1 约束的基本概念

数据库运行时,应当防止输入或输出不符合语义的错误数据,始终保持其中数据的正确性,这就是通常所说的数据库完整性。数据库完整性约束一般是一些规则和约束条件,这些规则和条件定义了数据库中数据的有效性和合法性,以防止不符合规则的数据插入、删除或更新。为了维护数据库完整性,数据库管理系统必须能够实现如下功能:

1.提供定义完整性约束条件的机制

完整性约束条件表达了给定的数据模型中数据及其联系所具有的制约和依存规则,以限定符合数据模型的数据库状态以及状态的变化,保证数据的正确、一致和有效。数据库管理系统必须向用户提供一系列概念和方法来描述完整性约束条件,包括实体完整性、参照完整性和用户自定义完整性等。

2.提供检查完整性约束条件的方法

当数据库中定义了完整性约束条件,数据库管理系统必须能够检查数据是否满足完整性约束条件。一般在插入、删除或更新操作执行后开始检查,也可以在事务提交时检查。检查这些操作后数据库中的数据是否违背完整性约束条件。

3.进行违约处理

数据库管理系统在执行完整性约束条件检查后,如果发现用户的操作违背了完整性约束条件,将采取一定的动作,如拒绝执行该操作,或级联执行其他操作以保证数据的完整性。

2.2.2 常见的约束类型

完整性约束用于确保数据库中数据的正确性和有效性,不同的约束类型可以应用在表中的列或表级别,以确保不同层级数据的有效性。以下是常用的一些数据约束类型:

1.实体完整性约束

实体完整性规则:若属性(一个或一组属性) A 是基本关系 R 的主属性,则 A 不能取空值。所谓空值即“不知道”“不存在”或“无意义”的值。

例如,在学生(学号,姓名,年龄,性别)关系模式中,“学号”为主属性,则关系中各元组在“学号”属性上的取值不能为空。如果主属性由多个属性构成,则每个主属性都不能为空。例如,在选修(学号,课程号,成绩)关系模式中,“学号”和“课程号”都是主属性,则这两个属性都不能取空值。

实体完整性约束是针对基本表而言的,一个基本表中的每个元组通常对应现实世界中的一个实体(或联系),而现实世界中的一个实体(或联系)是可区分的,主属性不能为空能够保证实体的唯一性,同时也确保了实体的可区分性(不允许不同元组在主属性上取值相同)。

2.参照完整性约束

参照完整性规则:若属性(或属性组) F 是基本关系 R 的外码,它与基本关系 S 的主码相对应(基本关系 R S 不一定是不同的关系),则对于 R 中的每个元组取值必须满足:

1)或者取空值( F 中的每个属性均为空值)。

2)或者等于 S 中某个元组的主码值。

并称基本关系 R 为参照关系,基本关系 S 为被参照关系。

需要指出的是,外码不一定要与相应的主码同名。不过,在实际使用中,为了便于识别,当外码和对应的主码属于不同关系时,通常给它们取不同的名字。

例如,在职工管理数据库中,存在“职工”和“部门”两个关系,其关系模式如下:

职工(职工号,职工姓名,性别,联系方式,部门号),

部门(部门号,部门名称,主管负责人)。

其中“职工号”为职工关系的主码,“部门号”为部门关系的主码,也为职工关系的外码。按照参照完整性规则,职工关系中的“部门号”属性只能取下面两类值:空值,表示尚未给该职工分配部门;非空值,该值必须是部门关系中某个元组的“部门号”值,因为职工不可能分配到一个不存在的部门中。

3.唯一性约束

唯一性约束用于确保表中的特定列或列的组合取值是唯一的,即不允许有重复值,防止重复数据的插入。唯一性约束允许表中某个元组在唯一性约束的列上取NULL值,但不允许多个行都包含NULL值。例如,在职工(职工号,职工姓名,性别,电子邮箱)关系模式中,可以对“电子邮箱”属性应用唯一性约束,以确保每个电子邮箱在整个表中都是唯一的。

4.非空约束

非空约束要求表中某些列的取值不为空(NULL值),以确保在插入或更新操作时为具有非空约束的列提供相应的值。例如,在职工(职工号,职工姓名,性别,电子邮箱)关系模式中,可以对“姓名”属性应用非空约束,确保每个职工都有相应的职工名。

5.默认值约束

默认值约束指在基本关系中插入新的记录时,如果用户未提供相应值,将在新插入元组中自动设置对应列的值为默认值。如果用户插入操作提供了对应值,则使用该值。例如,在职工(职工号,职工姓名,性别,民族)关系模式中,可以对“民族”属性应用默认值约束,默认值为“汉族”。当插入新的员工记录时,自动将其“民族”属性设置为“汉族”。

6.用户自定义约束

不同的关系数据库系统具有不同的应用环境,也具有不同的约束条件。用户自定义约束就是针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求。用户自定义约束依赖于自定义规则或条件,这些规则通常不是数据库系统内置的。它们可以是复杂的业务逻辑、数据验证规则或特定的数据要求。例如,在选修(学号,课程号,成绩)关系模式中,学生的考试成绩必须在0~100之间,这就是针对具体关系提出的用户自定义约束。

2.2.3 约束的控制与管理

数据库约束是确保数据库中数据的正确性和有效性的重要工具。数据库管理系统向用户提供了多种类型的约束,用户可以针对实际应用情况进行约束的创建、修改、删除、启用和禁用等操作。在设计数据库表时,可通过指定关系模式中某些属性为主码或外码来提供实体完整性约束和参照完整性约束。也可以在某些列上应用唯一性约束、非空约束、默认值约束或其他用户自定义约束。如果约束不再使用,可以将其删除,那么数据库管理系统将不再对删除的约束条件做完整性检查。当约束条件发生变化时,同样可以对约束进行修改,以满足新的语义要求。有时候需要临时禁用约束以进行数据导入或数据清理工作,这时可以对约束进行禁用和再启用操作。

2.2.4 存储过程与函数

数据库存储过程和函数都是重要的数据库对象,用于执行数据库操作和返回结果。但它们在数据库管理系统中的用途和特点不同。

存储过程是一种在数据库中创建、存储和执行的预编译程序单元,通常包含一组操作语句和程序逻辑,用于执行特定的数据库操作和任务。存储过程可以利用数据库管理系统所支持的特定语法和语句来定义,不同的数据库系统具有不同的存储过程语法,一般可使用CREATE PROCEDURE语句来创建存储过程。存储过程可以接受输入参数,这些参数允许外部调用者向存储过程传递数据,也可以用于指定存储过程的行为和操作。存储过程同样可以返回零个或多个结果集。结果集可以包含从数据库中检索的数据,也可以是输出参数,用于将值传递回调用者。图2-6为一个存储过程示例,该存储过程名为InsertUser,接收两个输入参数@Username和@Email,用于指定要插入的用户名和电子邮件。存储过程的主体中将提供的用户名和电子邮件插入到User表中的相应列。通过使用EXECUTE或CALL语句来执行存储过程。

数据库函数的主要目的是计算值或执行操作,然后返回结果。它们通常用于处理和转换数据,以及执行一些通用的计算,如数学运算、日期处理、字符串操作等。不同的数据库管理系统支持不同的函数,每个函数都有特定的语法和语句完成特定功能。同样,函数也可以接受零个或多个输入参数,这些参数可以是常量、列名、表达式或其他函数的结果等。函数必须返回一个值,可以是标量或结果集,用于用户后续其他操作。目前,多数数据库管理系统都提供了一些内置函数,用于执行常见的操作,如日期时间处理函数now( )、dateadd( ),聚合函数sum( )、avg( )等。用户也可以自定义函数来完成相应的操作和计算。图2-7为用户自定义函数示例,CalculateTotalPrice为函数的名称,@productPrice和@taxRate为函数的两个输入参数,表示产品价格和税率;函数返回一个数值型数据,表示产品的总价。该函数的功能是计算产品的总价,并将其作为函数返回值返回。

图2-6 存储过程示例

图2-7 用户自定义函数示例

2.2.5 断言

断言是一种用于强制实施数据库完整性和业务规则的数据库对象,通过声明断言可以指定更具一般性的约束,可以定义涉及多个表或聚集操作比较复杂的完整性约束条件。不同的数据库管理系统可能具有不同的语法来定义断言,通常使用Create Assert声明断言。断言可以在特定的数据库操作之前或之后触发,具体取决于它们的定义。断言常应用于表级别,但某些数据库系统也支持在特定列上定义断言。

断言的主要组成部分是条件,它是一个布尔表达式,用于描述所需的数据约束。断言创建后,任何断言中涉及的操作都会触发关系型数据库管理系统对断言的检查,任何使断言不为真的操作都不会被拒绝执行。

2.2.6 触发器

触发器是针对数据表的特殊存储过程,主要是通过事件进行触发而被自动执行的程序。与存储过程通过调用过程名执行的不同之处在于,触发器在执行某些特定的数据操作语句时通过事件进行触发而被执行。它与表紧密相连,当用户对表中数据执行插入、删除、修改等操作时,触发器便会自动执行所定义的语句,以保证数据的完整性和一致性。

1.触发器的作用

在主流的数据库管理系统中,可以用约束和触发器两种方式来执行业务规则和保证数据的完整性。相比于约束,触发器可以实现更为复杂的数据完整性约束,实现实体完整性约束和参照完整性约束不能保证的数据的一致性。利用触发器可以实现相关多个表的级联更新,其主要作用如下:

(1)触发器可以强制数据完整性 触发器利用数据操作语言处理复杂的业务逻辑,不仅能够支持约束的所有功能,而且可以实现更为广泛、复杂的数据完整性约束。约束通常作用在单个列上,且用于简单的条件检查;而触发器可以应用于整个表或特定操作,执行复杂的业务逻辑,包括跨表操作。

(2)触发器自动执行 触发器不需要用户调用执行,它是通过事件触发而自动执行的,可以在对表中数据进行插入、更新或删除等操作之前或之后触发,事件发生时,触发器就会立即被激活而自动执行。

(3)实现数据库中多个表级联更改 触发器虽然是在一个表上建立的,但可以针对多个表进行跨表操作,用户可以利用触发器对数据库中相关的表进行级联更新,而且可以评估数据修改前后的状态,并根据差异采取对策。如在学生信息表中创建一个级联删除的触发器,当学生信息表中的记录被删除时成绩表中相关的记录也被删除。

(4)返回自定义的错误信息 约束是不能返回信息的,而触发器可以。例如,当插入一个违背完整性约束的数据值时,触发器可以返回一个具体的错误信息给应用程序。

2.触发器的分类

目前,主流商用数据库管理系统主要支持的触发器有三种:DML触发器、DDL触发器和登录触发器,说明如下:

(1)DML触发器 DML(数据操作语言)触发器是在向数据库指定表或视图执行数据操作事件时执行的存储过程,包括插入数据(Insert)、更新数据(Update)和删除数据(Delete)。DML可以根据触发时机的不同进一步分为After触发器和Insert of触发器。其中After触发器为后触发器,在执行Insert、Update和Delete语句并且记录被修改完后触发器才被激活,主要用于记录变化后的处理或检查,如果有错误,修改后的数据可以恢复到之前的值。Insert of触发器又称前触发器,在记录变更之前被触发,并取代原来的数据操作,而去执行触发器本身定义的操作。

(2)DDL触发器 DDL(数据定义语言)触发器是在响应数据定义语言事件时执行的存储过程。主要包括创建(Create)、修改(Alter)和删除(Drop)语句,用于执行数据库的管理工作。如防止数据库中表的结构被修改、审核和规范数据库操作。

(3)登录触发器 “登录触发器”主要以用户登录时执行某些操作或记录登录活动为目标。这些触发器可以用于多种目的,例如记录登录历史、触发警报或执行额外的安全检查。如数据库中有用于存储用户信息的user表,包括用户名和登录时间字段,若希望每次用户登录时记录登录时间,即可以在user表上创建触发器。

3.触发器的管理

对数据库中现有的触发器可以进行修改、删除、查看、启用和禁用等操作。当触发器不满足需求时,可以修改触发器的定义以及各种属性。当触发器不再使用时,也可以将其删除,删除触发器并不影响它所操作的数据表。如果暂时不使用已创建的部分触发器,也可以将其禁用。禁用后,当有触发事件发生时,触发器不会执行,只是作为对象存储在当前数据库中。 WGBOXxv0Ij6rwpMwt0Rsvkc1o2givnN2d95IO7V2sKoWJdsGeWZqiNoNVfi348ms

点击中间区域
呼出菜单
上一章
目录
下一章
×