完整性控制
了解完整性约束:
- 数据的完整性
数据完整性的提出,其实是为了防止数据库中存在非法数据,或者防止用户向数据表输入非法数据等。这里所说的非法数据指的是不符合实际情况和规定的数据,例如,在年龄字段中输入的3000,在score表中输入student表中并不存在的学号等等。
数据完整性被分为4大类,分别是实体完整性(Entity Integrity)、域完整性(Domain Integrity)、参照完整性(Referential Integrity和==用户自定义完整性(User-definedIntegrity)==等。下面对其进行简要介绍。- 实体完整性(Entity Integrity)
这类完整性用于防止数据表中有重复的记录存在。在数据表中通过设置主键(PRIMARY KEY)约束、外键(FOREIGN KEY)约束和惟一(UNIQUE)约束,使得表中每一行记录都能表示惟一的一个实体对象。 - 完整性(Domain Integrity)
这类完整性用于防止用户向数据表的具体字段输入非法数值,或不向必填字段输入数据等等。要使得满足域完整性,则可以使用校验约束(CHECK)、非空约束(NOT NULL)或外键(FOREIGN KEY)约束等几个约束实现。 - 参照完整性(Referential lntegrity)
这类完整性防止多个相关表之间的数据不一致。例如,在score表中存在“张三”各科成绩的情况下,设置参照完整性可以防止将student表中“张三”的记录删除。甚至还可以解决,在student表中更改“张三”这条记录的主键“学号”的值时,数据库系统自动更新score表中所有“张三”成绩记录的“学号”值。这样就很好的维护了多个相关表之间的数据一致性。参照完整性可以通过设置主键(PRIMARY KEY)约束和外键(FOREIGN KEY)约束实现。 - 用户自定义完整性(User-defined Integrity)
有时,使用数据库系统提供的完整性约束并不能解决用户的需求。所以,有些数据库管理系统为用户提供了自定义完整性的功能。
- 实体完整性(Entity Integrity)
- 完整性约束的类型
数据库的完整性要通过设置约束来解决。因此,理解约束和使用约束就变得尤为重要。数据库的完整性约束有三种基本类型,分别是与表相关约束、域约束与断言。- 与表相关的约束是在表中定义的一种约束,其应用是最多的,并且有多种约束选项,如非空(NOT NUL)约束、主键(PRIMARY KEY)约束、外键(FOREIGN KEY)约束、校验(CHECK)约束、惟一(UNIQUE)约束等。在定义字段时可以定义与表相关的约束,此时称其为字段约束。在定义表时确定的与表相关的约束被称为表约束。
- 域约束是在域定义中确定的一种约束,它与域中定义的所有字段都有关系。域约束只能使用校验(CHECK)约束选项。
- 断言是在定义断言时确定的约束,断言可以与一个或多个数据表关联。断言只能使用校验(CHECK)约束选项。
与表有关的约束:
- 字段约束与表约束的创建
- 字段约束是某字段的特定约束,被包含在字段的定义中,即书写在字段的定义之后用空格分隔开,而不必指定字段名。
字段约束的语法格式为:<字段名><类型定义>[其他定义][约束类型]
- 表约束与字段定义相互独立,不包含在字段定义中。表约束通常对多个字段一起进行约束,与字段定义用逗号分隔开。
定义表约束时,必须指定所要约束的所有字段名。
表约束的语法格式为:[CONSTRAINT 约束名]<约束类型>(字段名1,字段名2,....,字段名n)
- 字段约束是某字段的特定约束,被包含在字段的定义中,即书写在字段的定义之后用空格分隔开,而不必指定字段名。
- 非空约束
- 对于数据表中的字段可以设置非空(NOT NULL)约束,即把字段设置为必填字段。在默认情况下,表中所有字段都可以接收空值(NULL)。但给字段设置非空约束后,则字段不能再接收空值。
- 只有字段约束支持非空(NOT NULL)约束,而表约束、域约束、断言不支持非空约束。
- 定义非空约束的语法格式为:
<字段名><类型定义>[其他定义][NOT NULL]
- 唯一约束
- 唯一约束用于表中的非主键字段,
UNIQUE
约束保证一个字段或者多字段的完整性,确保这些字段不会输入重复的值。定义了UNIQUE
约束的字段称为唯一键,系统自动为唯一键创建唯一索引,从而确保唯一键的唯一性。 - 唯一键的值可以是“NULL”值,但系统为了确保其唯一性,不允许出现多个“NULL"值而只允许出现一个“NULL”值。(MySQL允许多个空值)唯一约束可以用于字段约束,也可以用于表约束。
- 唯一约束做为字段约束时,将其定义在字段后用空格隔开,其语法格式为:
<字段名><类型定义>[其他定义][UNIQUE]
- 当唯一约束做为表约束时,将其定义在所有字段之后进行并用逗号隔开,语法格式为:
[CONSTRAINT 约束名] UNIQUE(字段名1,字段名2,...)
- 唯一约束用于表中的非主键字段,
- 主键约束
在数据库表中,通常用一个字段或者几个字段的组合值,惟一的标识表中的记录。人们将这一字段或者字段的组合称为主键。通过设置主键(主键约束)可以防止表中有重复记录出现,即保证了实体完整性。- 主键约束与惟一约束很相似,但有下面的区别。
❀一个数据表中可以设置多个UNIQUE
约束,但只能设置一个主键。
❀被设置为主键的字段值不能是NULL值,而被设置为UNIQUE
约束的字段值允许是NULL值。 - 定义主键约束(PRIMARY KEY)时,可以用于字段约束,也可以用于表约束,还可以通过
ALTER TABLE
语句定义。 - 主键约束做为字段约束时,将其定义在字段后用空格隔开,其语法格式为:
<字段名><类型定义>[其他定义][PRIMARY KEY]
- 当主键约束做为表约束时,将其定义在所有字段之后进行并用逗号隔开,语法格式为:
[CONSTRAINT 约束名] PRIMARY KEY(字段名1,字段名2,...)
- 主键约束与惟一约束很相似,但有下面的区别。
- 外键约束
FOREIGN KEY
约束定义A表中的数据与B表中数据的联系,为表中的一个字段或者多个字段的数据提供数据完整性参照。FOREIGN KEY
约束通常是和PRIMARY KEY
约束或者UNIQUE
约束同时使用的。FOREIGN KEY
约束指定某一个字段或一组字段做为外部键,而包括外键的表称为子表,包括外键所引用的主键的表称为父表。子表在外键上的取值是父表中主键的值或是取空值,以此确保两个表的连接,保证实体的参照完整性。- 对于
FOREIGN KEY
约束需要注意以下几点:
❀一个表最多只能参照253个不同的数据表,每个表也最多只能有253个FOREIGN KEY
约束。FOREIGN KEY
约束不能应用于临时表。
❀FOREIGN KEY
字段对应的父表中的字段在父表中必须是主键或是有UNIQUE
设置的字段。在实施FOREIGN KEY
约束时,用户必须至少拥有被参照表中参照字段的SELECT
或者REFERENCES
权限。
❀FOREIGN KEY
约束同时也可以参照自身表中的其他字段。❀FOREIGN KEY
字段上的取值可以是NULL值。
❀FOREIGN KEY
约束,只能参照本身数据库中的某个表,而不能参照其他数据库中的表。跨数据库的参照只能通过触发器来实现。 - 外键约束可以用于定义字段约束,也可以用于表约束,还可以通过
ALTER TABLE
语句定义。 FOREIGN KEY
约束做为字段约束时,将其定义在字段后用空格隔开,语法格式为:<字段名><类型定义>[其他定义] REFERENCES 父表名(父表中的主键字段名)
- 当外键约束作为表约束时,应当将其定义在所有字段之后进行并用逗号隔开,其语法格式为:
CONSTRAINT 约束名 FOREIGN KEY(字段名) REFERENCES 父表名(字段名)
- 创建失败的话需要添加引擎
ENGINE-InnoDB
- 扩展外键约束的内容
在输入或删除记录时,引用完整性保持表之间已定义的关系。引用完整性确保键值在所有表中一致。这样的一致性要求不能引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。- 在保持子表中的外键约束字段与父表中的主键约束(或惟一约束)字段的引用完整性,数据库管理系统要进行以下破坏引用完整性的检查:
- 向子表插入记录时,数据库管理系统必须确保插入到子表中的每一条新记录的
FOREIGN KEY
约束字段值是父表的参考字段(有主键约束或惟一约束的字段)中有匹配的字段值,否则系统禁止进行插入语句。 - 更改父表中的值并导致相关子表中的记录孤立。从父表中删除记录,但仍存在与该记录匹配的相关记录。如果要删除的父表的记录中,参考字段的值被子表的外键约束字段所引用,则数据库管理系统禁止进行删除记录操作。如果一定要进行删除,则必须先删除其子表中的引用记录,才能删除父表的记录。(更新同理,要先删除子表中的记录)
- 在更新子表中
FOREIGN KEY
约束字段的值时,要注意子表中新的FOREIGNKEY
值必须在父表的参考字段中有匹配的字段值,否则数据库管理系统禁止进行记录更新操作。
- 向子表插入记录时,数据库管理系统必须确保插入到子表中的每一条新记录的
- 在保持子表中的外键约束字段与父表中的主键约束(或惟一约束)字段的引用完整性,数据库管理系统要进行以下破坏引用完整性的检查: