数据完整性是为了保证插入到数据库中的数据是正确的,防止用户可能的错误输入。
数据完整性分为实体完整性、域完整性、参照完整性。
1.实体完整性
实体完整性中的实体指的是表中的行,因为一行记录对应一个实体
实体完整性规定表的一行在表中是唯一的实体,不能出现重复。
实体完整性通过表的主键来实现。
创建主键的两种方式:
(1)行内创建
create TABLE customers(
id int primary key, --设置id是直接将其设置为主键
name varchar(100),
address varchar(255),
);
(2)行外设置
create TABLE customers(
id int primary key,
name varchar(100),
address varchar(255),
);
alter table customers add primary key(id) --在行外以添加字段的形式设置主键
2.域完整性
域完整性指数据库表的列必须符合某种特定的数据类型或约束,比如说数据类型,长度,非空约束,唯一约束等等
如图,图片中的类型,长度,小数点,不是null都是域完整性的表现
3.参照完整性
参照完整性指的就是多表之间的设计,主要使用外键约束。
常用的多表设计有:一对多,多对多,一对一
(1)一对多
顾客与订单的关系就是一对多,一个顾客可以有多个订单,一个订单只对应一个顾客
创建顾客信息表:
create table customers(
id int,
name varchar(100),
address varchar(255),
PRIMARY KEY(id)
);
创建订单信息表:
create table orders(
order_num int primary key,
price float(8,2),
status int,
customer_id int,
constraint customer_id_fk foreign key(customer_id) REFERENCES customers(id) --外键约束
// 在外键约束中 constraint代表约束,foreign key代表外键,references值目标表中的参照
//
);
扩展:子表的删除,更新策略
在一对多表中,子表的删除,更新有四种,如图所式,分别是cascade(层叠级),no action(无动作),rstrict (主表约束),set no(置空策略),如图所示:
1)cascade 级联策略。使用此种策略时主表的记录被删除或者主键字段被修改 时会 同步删除或修改子表
2)no action 无动作策略。使用此种策略时要删除主表必须先删除子表,要删除 主表的记录 必须先删除子表关联的记录,不能更新主表主键字段的值。
3)RSTRICT 主表约束策略。此种策略对主表的约束跟 NO ACTION 一样
4)SET NO 置空策略。使用此种策略时,如果主表被删除或者主键被更改,则将子表中的外键设置为NULL。需要注意的是,如果子表的外键是主键或者是设置为NOT NULL的,则主表的删除和主键的更改跟 NO ACTION 一样。
(2)多对多
多对多模式的典型代表就是师生关系,一位老师对应多名学生,一名学生对应多位老师
首先,创建一个教师列表:
create table teachers(
id int,
name varchar(100)
salary float(8,2),
primary key(id)
);
再创建一个学生列表:
create table students(
id int,
name varchar(100),
grade varchar(100),
primary key(id)
);
再创建一个表格,显示老师与学生间的对应关系:
create table teacher_student(
t_id int,
s_id int,
primary key(t_id,s_id)
constraint teacher_id_fk foreign KEY(t_id) REFERENCES teachers(id),
constraint student_id_fk foreign KEY(s_id) REFERENCES students(id)
);
(3)一对一
按照外键关联在IdCard表中的外键添加唯一约束
按照主键关联对主键添加外键约束