完整性约束
约束:
为什么要使用约束?
为了保障数据的合法性,完整性
分类:
not null:非空约束,数据不能为空
例如:学生表的姓名字段
create table student(id int,name char(10) not null,sex char(1) default "woman")
unique: 唯一的约束,该字段的值不能重复,例如:身份证,手机号,学号
unique其实是一种索引,索引是一种数据结构,用于提高查询效率,它可以为空,一张表中可以有多个唯一约束
单例唯一约束
create table t5(idcard char(18) unique);
多列联合唯一约束
create table t6(idcard char(18),phonenumber char (11),unique(idcard,phonenumber));
意思: 身份证相同并且手机号相同,那就叫相同
primary key :称之为主键约束,用于唯一标识表中一条记录
如何能做到唯一标识,该字段只要是唯一的并且不为空即可 ,也就是从约束的角度来看主键约束和非空加唯一约束没有区别。
那他们之间的区别是什么?
唯一约束是一种索引,必然存在硬盘上的某个文件中,是物理层面,primary key是一种逻辑意义上的数据,实际上不存在。
语法:
create table stu(stuid int primary key,name char(3));
create table t7(id int unique not null,name char(3));
有主键和没有主键的区别?
1.无法区分两个相同记录,比如班级里的两个人名字相同
2.有主键意味着有索引,效率更高
3.可以建立关联联系
要不要主键?
必需的,每个表都应该有主键,哪怕不用唯一标识,也应该考虑提升效率,主键的字段名几乎都叫id
同一个表中可不可以有多个主键?
不可以,没有任何意义
主键的类型需要设置为整型
练习 创建一个员工表 里面存储 员工信息 员工编号 姓名 年龄 性别 create table employee (id int primary key,name char(10) not null,age int not null,sex char(10) default "man"); 插入数据 insert into employee values(1,"杨总",20),(2,"egon",49),(3,"wxx",28); 问题? 你很可能忘记上一次的id到第几了 导致你要先查看一下 麻烦影响效率 所以有了auto_increment auto_increment ****** 中文 自动增长 作用 通常搭配主键字段使用 可以自动为你的数据分配逐渐 如何分配的? 添加一条就自动加1 计数从1开始 语法: ****** create table t9(id int primary key auto_increment,name char(3)); 如果主键是自动增长 你可以跳过这个字段 也可以为它插入null 都可以 修改自动增长的起始位置 ** alter table t9 auto_increment = 7; 注意: 自动增长 只能用于整型
foreign key:专门用于为表和表之间建立物理关联
思考:
两个表之间能产生的关系头哪些? 1.多对多;2.多对一;3.一对一;4.一对多 在查表之间的关系时,要站在不同的角度去思考。例如对一个公司而言: 1. 从员工出发,员工对部门来说,多个员工对应一个部门 2.从部门出发,一个部门对应多个员工 如果两个得到的关系不同,则认为这种多对一的关系时单向的 练习:设计学员表和班级表(外键加到从表上) create table class (id int primary key auto_increment,name char(10),manager char(10)); create table student (id int primary key auto_increment,name char(10),manager char(10),c_id int,foreign key(c_id)references class(id));
总结:外键的作用,表与表之间建立联系
添加 外键约束时:产生的限制
被关联的表需要先被创建,部门数据(主表)应该先插入,员工数据(从表)后插入,在删除部门数据前,要保证该部门的员工数据都删除了,在更新部门编号前,要先保证没有员工关联到这个部门
简单来说,外键指的就是另一张的主键
外键加上以后,主表中的数据删除和更新时都受到限制
解决方案是为外键添加级联操作
级联操作:指的就是同步更新和删除
语法:在创建外键时,在后面添加 on update cascade 同步更新;on delete cascade 同步删除 实例: create table class(id int primary key auto_increment,name char(10)); create table student( id int primary key auto_increment, name char(10), c_id int, foregin key(c_id) references class(id) on update cascade on delete cascade ); insert into class vallue(null,"python3期"); insert into student value(null,"张煜"’,1) 对主表的id进行更新,以及删除某条主表记录,来验证效果
多对多关系的处理:
建立一个第三方表,专门存储两个表之间的关系,这个关系表应该有两个字段,分别关联学生的id和老师的id,为了保证数据刷的合法性,完整性给这两个字段都添加外键约束
实例: create table teacher(id int primary key auto_increment,name char(10)); create table student(id int primary key auto_increment,name char(10)); create table t_s(t_id int, s_id int, foregin key(t_id) referenses teacher(id), foregin key(t_id) referenses student(id), primary key(t_id,s)id)); insert into student value(null,"lxx"); insert into teacher value(null,"exx"); insert into t_s value(1,1);
上一篇: iconv
下一篇: 分享一个自己弄的RSA秘钥格式转换的工具