数据完整性
1.什么是数据完整性?
存储在数据库中的数据能够正确的反映实际情况,规定数据的输入数据不能是无效值,错误值和乱码等。
2.数据完整性的类型
(1)实体完整性:标识符或主键的完整性,使其值唯一
(2)域完整性:限制类型,格式和取值范围
(3)引用完整性:保持原表和引用表数据一致性
(4)用户自定义完整性:根据用户的要求自定义业务规则
3.数据完整性的实现方式
实体完整性:主键约束、唯一的约束
域完整性:检查约束、默认值约束、外键约束
引用完整性:外键约束
用户自定义完整性:以上所有约束自由组合
4.什么是约束?
通过创建表来限制属性或表中数据的完整性,也可以通过修改语句修改约束条件。
约束又分为行级约束和表级约束,行级约束和表级约束本质上是一样的,只是约束范围不同。
非空约束、主键约束一般为行级约束,
外键约束(联合主键)是表级约束;
检查约束(check)随意
二、非空约束
确保当前约束的属性不为空置,行级约束
非空约束的关键字: not null
三、唯一约束
指定某一列或某几列的数据不能重复
唯一约束关键字:unique
可以通过constaint给约束取名,方便根据名称删除约束;
同时设定非空和唯一默认为主键
创建复合唯一约束(表级约束)
对多个列进行唯一约束,约束两个以上的字段(属性)不能同时一致。
constraint uni_tno_tname unqiue(t_no,t_name)
这里教师编号与教师名称可以允许其中一个是相同的,但不能同时相同。
四、主键约束
非空约束+唯一约束,且每个表只能有一个主键约束(表级),在多列联合的主键约束时,联合主键的值不能重复。
主键约束关键字:primaty key。
如果数据表的属性列中存在重复或者null值,就无法以此属性为主键
1.在创建表时设置主键约束
设置单列主键
s_no int primaty key,
设置多个属性为联合主键
constraint pri_tno_tname primary key(t_no,t_name)
2.添加主键约束
alter table teacher add constraint pri_tno_tname
primaty key(t_no);
3.删除主键约束
alter table teacher drop primary key;
4.自增列
在插入数据时,如果不规定属性的值,其值就会根据上一个属性的值自动加1。
自增列关键字:auto_increment
属性给空值时,初始默认值从1开始,之后的每一个在其基础上+1。
在创建时可以在表后设置初始默认值:auto_increment=100
去掉自增列属性与之前的方法一致。
五、检查约束
检查约束就是检查列中属性的取值范围。
检查约束关键字:check。
如:t_age int check(age>0 and age<200)
t_sex varchar(4) check(t_sex='男' or t_sex='女')
MySQL不支持check,需要在外部进行判断。
六、默认值约束
默认值关键字:default
1.创建表属性时添加默认值约束
s_subject varchar(20) default 'C++',
2.添加默认约束
alter table student modify column
3.删除默认值约束
与添加默认值方法一致,只是不加默认值关键字就可以了。
七、外键约束
一个表中的属性值参考另一个表中的主属性的值,也就是外键值参考主键值,由于外键约束是表级约束,参考主键值,所以要在创建表之前先创建参考表
外键约束关键字:foreign key(属性名)reference 表名(属性)
外键约束属性数据类型必须相同
1.创建表时建立外键约束
外键和参考表的主键数据类型,长度和精度要保持一致
c_no int not null
constraint for_cno foreign key(cno)
2.添加外键约束
由于外键约束是表级约束,需要关键字add。
alter table strudent add constraint for_cno
froeign key(c_no) references class(class_no);
3.删除外键约束
alter table student drop constraint for_cno;
4.级联更新/删除
是指父表中的元组更新或删除等操作对子表的处理方法。
其中有三种处理方式,分别是:
在更新/删除中(on update/on delete)
(1)cascade:父表中的元组更新或删除,子表中跟着更新或删除。在语句之后加上on update(或on delete)cascade
(2)no action:无动作,若子表中有匹配的记录,就不允许更新或删除父表数据。加上on update(或on delete)no action
(3)set null:设置为空,若子表中有匹配的记录,父表数据更新或删除,子表中对应数据变为null。on update set null
这些操作是对于父表的更新或者删除而言的,
使用格式:on update(cascade/no action/set null)
列如:on update cascade,
on delete (cascade/no action/set null)
列如:on delete set null;