首页 理论教育MySQL数据库设计与实现:添加约束及实现

MySQL数据库设计与实现:添加约束及实现

【摘要】:例4.1:为StudentInfo表建立主键约束。图4.13为表添加联合主键约束2.唯一约束唯一约束保证在一个字段或者一组字段里的数据与表中其他行的数据相比是唯一的。向表中增加字段可使用ADD关键字,语法与主键约束相似,增加约束的语句如下:3.默认约束为表添加默认值约束的语法为:默认值可以为常量或者为空。图4.14添加约束运行结果是检查约束没有创建成功,如图4.15所示。

添加约束可以使用ALTER TABLE语句,其一般形式为:

1.主键约束

主键约束在表中定义一个主键来唯一确定表中每一行数据,被主键约束的列(字段)是唯一的、非空的。

添加主键约束的语法:

当多于一个字段时,上述语法添加的就是联合主键约束。联合主键一般用于字段中数据都可重复的表,但又要确保实体完整性,所以使用多个字段确保实体完整性。

例4.1:为StudentInfo表建立主键约束。

上述语句将学员信息表的stuno字段设置为主键,命名时主键一般简写为“PK”。也可以在创建studentinfo表的时候建立主键约束,如:

添加联合主键约束:

下面图中演示了两种可以向表中添加联合主键约束的语法,添加成功后可使用describe查看表结构,如图4.13所示。

图4.13 为表添加联合主键约束

2.唯一约束

唯一约束保证在一个字段或者一组字段里的数据与表中其他行的数据相比是唯一的。向表中增加字段可使用ADD关键字,语法与主键约束相似,增加约束的语句如下:

3.默认约束

为表添加默认值约束的语法为:

默认值可以为常量或者为空(NULL)。

例4.2:为StudentInfo表的Address字段建立默认值约束。

上述语句为学生信息表的家庭地址字段address设置了默认值“地址不详”,命名时默认值约束一般简写为“DF”。也可以在创建studentinfo表的时候建立默认值约束,如:

向表中添加默认约束成功后,可使用describe查看表结构。

4.检查约束

MySQL中检查约束的创建与SQL SERVER中语法是有区别的,如图4.14演示按照SQL SERVER的语法在MySQL中创建是不能生效的。

图4.14 添加约束(www.chuimin.cn)

运行结果是检查约束没有创建成功,如图4.15所示。

图4.15 查看表结构

例4.3:为studentinfo表的stusex字段建立CHECK约束。

stusex列存储的是学员的性别,假如规则性别只能输入男或者女,在MySQL中可以使用枚举来实现。

其它约束的实现在MySQL中可以通过触发器来实现,触发器将在后续章节中进行讲解。

5.外键约束

外键约束定义了表间关系,用于强制参照完整性,为表中一列或者多列数据提供参照完整性。

例4.4:为studentinfo表和classinfo表建立外键关系。

上述语句为学生信息表的所在班级字段classid设置了外键约束,命名时外键约束一般简写为“FK”。也可以在创建studentinfo表的时候建立外键约束。

6.设置级联操作

MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包括RESTRICT、NO ACTION、SET NULL和CASCADE。

其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新;CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录;SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被SET NULL。

因为只有InnoDB引擎才允许使用外键,所以,数据表必须使用InnoDB引擎。

例4.5:删除classinfo主表信息时,设置studentinfo丛表信息为空。

上述语句为学生信息表的所在班级字段classid设置了外键约束,并设置对主表数据进行删除时,从表对应的数据设置为null,当执行delete from classinfo where classid=1时,删除主表数据后,从表数据自动设置为null。如图4.16所示。

图4.16 从表对应数据为null

例4.6:设置级联删除。

删除主表classinfo数据时,自动删除studentinfo表中数据。

上述语句为学生信息表的所在班级字段classid设置了外键约束,并设置对主表数据进行删除时,从表对应的数据自动删除,当执行delete from classinfo where classid=1时,删除主表数据后,从表数据已经自动删除。如图4.17所示。

图4.17 从表对应数据为null