数据表约束也称为数据完整性约束,是指数据表结构中关于对数据记录信息的限定与规范,包括了类型、长度、是否为空、是否唯一、主键、外键、默认值等方面的约束。数据表约束一般在创建数据表时即定义,也可以在数据表创建好后再适当修改、变更。
数据表约束通常包括三方面:实体完整性、参照完整性和用户自定义完整性。实体完整性和参照完整性是关系数据表必须满足的完整性约束条件,用户自定义完整性约束则是为满足实际业务需求而额外添加的约束项,为关系数据表的非必要性约束。
主键约束也叫实体完整性约束,是三大数据表约束之一。主键是数据表的唯一性标识字段,通过该字段中的某一个数值即可确定一条对应的记录。主键包含两种类型,分别是单字段主键与联合主键。所谓主键约束是指在创建数据表时,即为数据表定义主键,使该数据表符合主键属性的相关要求与规范。
2.3.1 主键约束
单字段主键是在数据表中指定其中一个字段作为表的主键字段,作为主键的字段必须受主键的相关规范约束,不得出现重复性数值,也不能出现空值。主键在数据表定义时声明,有两种声明格式。
在创建数据表的过程中,直接在某个字段上声明为主键字段,单字段主键语法格式为:
主键声明SQL语句:
以上SQL语句定义了一张名称为“book”的数据表,在声明表字段的同时通过关键字“PRIMARY KEY”指定“id”字段为数据表的主键。
在创建数据表的过程中,所有的表字段声明完毕后,最后选择某字段作为主键字。
单字段主键语法格式为:
主键声明SQL语句:
以上SQL语句定义了一张名称为“clothes”的数据表,先声明表字段,然后通过关键字“PRIMARY KEY”指定“id”字段为数据表的主键。
在一些特定的数据表中,单字段主键是无法满足业务建模的需求,这时就要考虑多字段的联合主键。联合主键字是在数据表中指定其中两个或两个以上的字段共同作为表的主键字段,联合主键同样符合主键的属性与规范,受相关约束。
联合主键需要在创建数据表的过程中,先声明数据表字段,然后再指定相关字段为共同主键字段。
联合主键语法格式为:
主键声明SQL语句:
以上SQL语句定义了一张名称为“student_course”的数据表,先声明表字段,然后通过关键字“PRIMARY KEY”指定“student”和“course”字段为数据表的联合主键。
外键约束也叫参照完整性约束、引用完整性约束,同样是三大数据表约束之一。外键是两张数据表之间的关联约束,从本质上来说外键是表连接时字段的引用。当数据表建立连接时,从表通过外键关联主表数据,从而得到对应的连接记录信息。被关联的数据表称为主表,去关联人家的数据表称为从表。
一张从表中可以有多个外键,可以关联多张数据表,而作为主表的被引用字段必须是本表中受唯一性约束的字段,可以是本表中的主键字段,也可以是其他有唯一性约束的非主键字段。外键的作用是保证数据引用的完整性、一致性,外键值不允许为空。
一般在创建数据表的过程中,直接声明关联外表的某个字段作为本表的外键。
外键语法格式为:
主表声明SQL语句:
从表中外键声明SQL语句:
以上SQL语句首先定义了一个名称为“country”的数据表,为主表,表中的“id”字段为主键,是唯一性字段。接着第二个SQL语句定义了一个名称为“member”的数据表,为从表,在创建数据表的同时声明了从表中的“country_id”字段去引用主表“country”中的“id”字段,从而建立外键关联引用关系。
当“member”数据表与“country”数据表建立了外键引用关系时,“member”数据表中的每一条记录的“country_id”字段值都必须是“country”表中“id”字段存在的数值,否则会造成数据异常。
非空约束是一种对数据表中字段值不允许置为空的强制性约束,字段添加此种约束后,往表中添加或更新数据时,相关字段都必须赋相关数据值,否则数据表将产生操作异常。非空约束通过“NOT NULL”关键字实现,一般在创建数据表时在相关字段上声明。
2.3.3 非空约束
非空约束语法格式为:
非空约束声明SQL语句:
以上SQL语句定义了一个名称为“computer”的数据表,在数据表的声明过程中,直接在每个字段结尾通过“NOT NULL”关键字声明每个字段值均受非空约束。数据表创建完成后,往数据表中写入数据时,每个字段都必须赋值,不允许为空,否则会提示无法写入,并报数据库错误。
唯一性约束与主键约束类似,要求数据表中相关字段的值不能重复,但因每张数据表只能有一个主键,因而在主键以外的字段有这种唯一性要求时,就必须添加这种唯一性约束来规范数据值。唯一性约束需要使用“UNIQUE”关键字,来实现相关功能,一般要在数据表创建时直接声明。
唯一性约束与主键约束最大不同的地方是允许空值存在,但空值最多只能一个,不允许有多个空值,以免出现数据重复,破坏了唯一性的要求。可以在数据表中为多个字段添加唯一性约束,相关语法如下。
唯一性约束语法格式为:
唯一性约束声明SQL语句:
以上SQL语句定义了一个名称为“employee”的数据表,在数据表的声明过程中,在“work_num”和“card_num”两个字段末尾通过“UNIQUE”关键字声明此两个字段的值必须保持各自的唯一性,不能重复。数据表创建完成后,往数据表中写入数据时,如果字段值出现重复,会提示无法写入,并报数据库错误。
自定义约束是指,根据应用环境要求和实际需要,对某一具体应用所涉及数据提出约束性条件。该约束机制一般不应由应用程序提供,而应由关系模型提供定义并检验。
在关系数据库中,用户自定义约束一般使用check()函数来实现,MySQL关系数据库在MySQL 8.0.16之前不支持check()函数约束,在后继版本中已经实现了对check()函数约束的支持。
创建用户工资表(user_salary),并为工资(salary)属性添加自定义约束,数值不能超过10000。
当往用户工资表(user_salary)写入数据时,如果“salary”字段值不超过check()函数约束值10000,可以正常执行写入操作,如果“salary”字段值超过check()函数约束值10000,则无法正常写入数据。
创建会员表(member),并为会员性别(member_sex)属性添加自定义约束,取值只能为集合中的元素:{'female','male'}。
当往会员表(member)写入数据时,如果“member_sex”字段取值为“female”或“male”,则在约束指定的数据项范围内,可以正常执行写入操作;如果“member_sex”字段取值为其他字符值,则超出字段约束指定的数据项范围,无法正常写入数据。
主键自增也叫字段自增,是专为主键字段服务的一种约束类型,指数据表中的主键字段能自动填充数据,并以序列的形式自增。字段值自增只适用于主键为整型类型的字段,不适用于其他字符、日期、浮点等类型。使用字段值自增可实现自动生成主键功能,实现字段自增要使用“AUTO_INCREMENT”关键字。
一般在创建数据表的过程中,直接声明数据表的主键字段为自增类型,主键自增语法格式为:
数据表及主键自增声明SQL语句:
以上SQL语句定义了一个名称为“exam”的数据表,在数据表的创建过程中,直接在INT类型的主键字段“id”末尾通过“AUTO_INCREMENT”关键字声明此主键值自增。数据表创建完成后,往数据表中写入数据时,主键“id”字段无须赋值,会自动从1开始依次增加,从而实现自动主键生成策略。