说明数据完整性之前做如下准备
#创建了一个表
CREATE TABLE IF NOT EXISTS class
(
classNo INT NOT ,
classNature VARCHAR(100),
classHeadmaster VARCHAR(20)
);
理解一对一、一对多、多对多的数据关系
(上图截取自详细的数据关系说明)
1. 数据完整性
数据完整性就是对数据库进行创建时,为了保证表中数据能够反映现实情况,而对表中数据列所做的约束
2. 数据完整性的主要内容
实体完整性:
确保表的关键信息不缺少
域完整性
确保录入信息复合常见要求
引用完整性
不能引用不存在的引用(表A依赖于表B,因此表A中的主键不能超过表B)
自定义完整性
自己添加的规则,需要满足
3.常见的约束语句
3.1 非空约束
关键字: NOT NULL
作用: 添加非空约束后,该列内容不能为空
实例:
CREATE TABLE class
(
classNo INT NOT NULL,#此处表示非空约束,加入后在添加数据时,不可为空
classNature VARCHAR(10),
classHeadmaster VARCHAR(10)
);
删除非空约束
ALTER TABLE class MODIFY COLUMN classNo INT;
添加非空约束
ALTER TABLE class MODIFY COLUMN classNo INT NOT NULL;
3.2 唯一性约束
关键字: unique
**作用:**添加唯一性约束的列A,列A的值不能重复
实例:
(因为前面已经创建了一个表,因此这里直接选择DDL语言更正)
alter table class modify column classNo int unique;
删除唯一性约束
alter table class modify column classNo int;
多列的唯一性约束:
#constraint 表示给两列的唯一性约束取别名
ALTER TABLE class ADD CONSTRAINT CNo_Headmaster UNIQUE(classNo,classHeadmaster);
3.3 主键约束
关键字: key
作用: 保证值的唯一性,且不能为空,主键作用请见主键的作用
添加主键
alter table class modify column classNo int key;
删除主键
alter table class modify column classNo int;
复合主键
关键字:primary key
作用:在一个表中给两列添加主键约束,两列都不能重复,都不能为空
实例:
#新建数据表
CREATE TABLE class2_student
(
stuNo INT,
stuName VARCHAR(30),
stuSex VARCHAR(20),
stuRanking INT
);
#复合主键操作
ALTER TABLE class2_student ADD PRIMARY KEY(stuNo,stuRanking);
3.4 自增约束
作用: 在向表格中添加数据时,如果该列设置为自动增长,则即使没有给该列赋值,也会随着数据行的增加而增加
要求: 自动增长的列必须是主键
关键字: auto_increment
实例
CREATE TABLE class3_student
(
stuNo INT KEY AUTO_INCREMENT,
stuName VARCHAR(30),
stuSex VARCHAR(20),
stuRanking INT
)AUTO_INCREMENT=2;#设置自动增长的初始值,不加默认从1开始
删除(添加)自增约束
ALTER TABLE class3_student MODIFY COLUMN stuNo INT;
限制值的范围
(此语法SQL不支持,但是可以用枚举代替)
create table test
(
age INT CHECK(age>0 AND age<100)
);
3.5 默认值约束
关键字: default
(在不添加default时,默认为NULL)
实例
#表示添加学生性别默认值为男
ALTER TABLE class3_student MODIFY COLUMN stuSex ENUM('men','women') DEFAULT 'men';
3.6 外键约束
关键字: foreign key
**作用:**只有在表A中的关键字存在的情况下,表B中的值才能插入
(例如插入一个学生的时候,不能往不存在的班级中插入学生)
CREATE TABLE blur_class_student
(
studentNO INT PRIMARY KEY,
classNo INT,
studentName VARCHAR(30),
#关键在此处
FOREIGN KEY(classNo) REFERENCES class(classNo)#将班级中的classNo与学生自带的classNo关联起来,只有班级表中存在的班号,才能在学生中插入
#————————————————
#以下两个语句的作用及说明请见后
ON UPDATE CASCADE#父表更新子表更细
ON DELETE CASCADE#父表删除子表删除
);
说明:
- 删除子表(学生表)父表(班级表)不会受到影响
- 删除父表(班级表)子表(学生表)会受到影响
对于删除父表,子表的三种处理方式:
- cascade: 删除父表或者修改父表,子表数据会同步修改
- no action: 不动-父表的增加、删除不会影响子表
- set null: 如果删除、修改父表,则对应的子表设置为null