表的数据完整性(MySQL怎么为表添加约束)——MySQL 5.7数据库


1.非空约束

       在前面的数据表定义过程中,每个字段都要有一个是否为null值的选择,这就是对数据表中将来的数据提出的约束条件。

(1)null(允许空值):

       表示数值未确定,并不是数字“0”或字符“空格”。表中的比较两个空值或空值与其他任何类型值比较的结果为空值。

(2)not null(不允许空值):

       表示数据列中不允许空值出现。这样可以确保数据列中必须包含有意义的值。对于数据列中设置“不允许空值”,在向表中输入数据时,就必须输入一个值,否则该行数据将不会被收入表中。

例如:

学生选课时,学号、课程号就不能为空值,因为这必须是确定值,才能描述哪位同学选的什么课。如果存在成绩字段,则成绩字段就应该允许空值,因为此时还没有结束课程,成绩是不确定的。

       设置表的非空约束是指在创建表时为表的某些特殊字段加上not null约束条件。非空约束将保证所有记录中该字段都有值。如果用户新插入的记录中,该字段为空值,则数据库系统会自动报错。


何云辉 CSDN

2.主键约束

       设置主键的主要是可以帮助MySQL以最快的速度查找到表中的指定信息。primary key可指定一个字段作为表主键,也可以指定2个及以上的字段作为复合主键,其值能唯一地标识表中的每一行记录,而且primary key约束中的列不允许取空值。
       由于primary key约束能确保数据唯一,所以经常用来定义标志列。
       可以在创建表时创建主键,也可以对表中已有主键进行修改或者增加新的主键。设置主键通常有两种方式:表的完整性约束和列的完整性约束。

(1)创建表时定义完整性约束

若在列定义的时加上关键字primary key,就可以定义列的完整性约束主键。
如:创建表course01,用列的完整性约束设置主键。

mysql>create table if not exists course01 
	  (courseno  char(6) not null primary key, 
	  cname  char(6) not null, 
	  type char(8) not null,  
	  period int(2) not null, 
	  exp int(2) not null,
	  term int(2) not null); 

在这里插入图片描述
说明:
(1)主键可以是单一字段时,可以是表级约束,也可以是列级约束。
(2)当表中的主键为复合主键时,只能定义为表的完整性约束。例如,前面定义score表时,就是采用这种方式。

(2)修改表的主键

如:修改表student02的主键,删除原来主键sname,增加studentno 为主键。

mysql> alter table student02 add primary key (sname);
mysql> alter table student02 drop primary key;
mysql> alter table student02 add primary key (studentno);

在这里插入图片描述


何云辉 CSDN

3.外键约束

(1)参照完整性

       在关系型数据库中,有很多规则是和表之间的关系有关的,表与表之间往往存在一种“父子”关系。例如,字段studentno是一个表score表的属性,且依赖于表student的主键studentno。那么,称表student为父表,表score为子表。通常将studentno设为表score的外键,参照表student的主键字段,通过studentno字段将父表student和子表score建立关联关系。
       外键的作用是建立子表与其父表的关联关系,保证子表与父表关联的数据一致性。父表中更新或删除某条信息时,子表中与之对应的信息也必须有相应的改变。

(2)设置外键的原则:

必须依赖于数据库中已存在的父表的主键;外键可以为空值。

这样,当需要在score表中添加、删除、修改studentno字段的数据时,其结果中的studentno值必须在student表存在。即编辑成绩表score中的学号studentno时,该学号必须是student表存在的学号。这种类型的关系就是参照完整性约束(referential integrity constraint)。

外键声明和参照完整性定义的语法格式如下:

constraint foreign_key_name  foreign key (col_name1 [,col_name2….])
references table_name(col_name1[,col_name2...)]) 
[on delete {restrict | cascade | set null | no action}] 
[on update  {restrict | cascade | set null | no action}] 

(1)constraint foreign_key_name:定义外键约束和约束名。foreign key (col_name1 [,col_name2….],外键引用的字段表。
(2)外键被定义为表的完整性约束,reference_definition中包含了外键所参照的表和列,还可以声明参照动作。
(3)restrict:当要删除或更新父表中被参照列上在外键中出现的值时,拒绝对父表的删除或更新操作。
(4)cascade:从父表删除或更新行时自动删除或更新子表中匹配的行

(5)set null:当从父表删除或更新行时,设置子表中与之对应的外键列为null。如果外键列没有指定not null限定词,这就是合法的。
(6)no action:no action意味着不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新父表中主要键值的企图不被允许,和restrict一样。
(7)set default:作用和set null一样,只不过set default是指定子表中的外键列为默认值。

(3)对已有的表添加外键

alter table语句在数据库teaching中,为表score添加外键约束。

mysql>alter table score
    -> add constraint fk_st_score 
    -> foreign key(studentno) references student(studentno);
mysql>alter table score
    ->add constraint fk_cou_score 
    ->foreign key(courseno) references course(courseno);

在这里插入图片描述

(4)在创建表时创建外键

       在mysqltest数据库,参照score表创建score1表,其中studentno作为外键,参照student02表中的studentno字段。

mysql> create table if not exists score1
    -> (studentno  char(11) not null, courseno char(6) not null,
	-> daily float(3,1) default 0, final float(3,1) default 0,
	-> primary key (studentno , courseno),
	-> foreign key(studentno)
	-> references student02(studentno)
	-> on update cascade
	-> on delete cascade);

在这里插入图片描述


何云辉 CSDN

4.检查约束

       利用主键和外键约束可以实现一些常见的完整性操作。在进行数据完整性管理时,还需要一些针对数据表的列进行限制数值范围的约束。例如,score表中final字段的数值要在0~100之间,表中birthdate必须大于1990年12月31日。这样的规则可以使用check完整性约束来指定。
       check约束在创建表时定义,可以定义为列完整性约束,也可以定义为表完整性约束。定义check约束时的格式比较简单。

       在mysqltest数据库中,对student02表的birthdate列添加check约束,要求出生日期必须大于1999年12月31日,性别只能是“男”和“女”。

mysql> alter table student02
  	-> add constraint ch_stu_birth
  	-> check(birthdate>'1999-12-31');

在这里插入图片描述


何云辉 CSDN

5.唯一性约束

       唯一性是指所有记录中该字段的值不能重复出现。设置表的唯一性约束是指在创建表时为表的某些特殊字段加上unique约束条件。唯一性约束将保证所有记录中该字段的值不能重复出现。创建表时可以设置列的唯一约束,也可以在已经创建的表的列上添加唯一。例如,在Email字段加上唯一性约束,所以记录中Email字段上不能出现相同的值。

如:在mysqltest数据库中,对student02表的Email列添加唯一约束。

mysql> alter table student02 add unique (Email);
mysql> select  studentno,sname,email  from student02;
mysql> insert into student02
       values ('16104444444' , '徐赛克', '男'  , 
       '2001-01-01',  '809', '13102020207', '[email protected]');
ERROR 1062 (23000): Duplicate entry '[email protected]' for key 'Email'
                                            //插入失败,违反唯一性约束的条件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明:
(1)一个数据表只能创建一个主键,但可以有若干个unique约束。
(2)主键列值不允许为null,而unique字段的值可取null,但是必须使用nullnot null声明。
(3)一般在创建primary key约束时,系统会自动产生primary key索引。创建unique约束时,系统自动产生unique索引。


何云辉 CSDN
发布了38 篇原创文章 · 获赞 15 · 访问量 1690

猜你喜欢

转载自blog.csdn.net/hyh17808770899/article/details/105114477