1.约束
什么是约束: 除了数据类型之外额外添加的约束
为什么要约束: 为了保证数据的合法性 完整性
分类:
一.not null:
非空约束 数据不能为空
默认为null
show table t1 ;
create table t1(id int ,name char(10) not null )
学生表的姓名字段
二. default :
默认值约束:可以指定字段的默认值
create table t1(id int ,name char(10) not null default "xx");
insert into t1(id) value(1)
就可以不用插入名字,成功
eg : 美柚的性别字段 默认为女 ; 游戏注册成功 送游戏币
三. unique:
唯一性约束 :该字段的值不能重复
unique (key)其实是一种索引 用于提高查询效率
一张表可以有多个唯一约束
身份证号码 手机号 用户的学号
create table t1(idcard char(18) unique ,name char(10) not null ,sex char(3) not null default "女" )
单列唯一约束:
create table t1(idcard char(18) unique )
多列联合唯一约束:
create table t1(idcard char(18),phonenumber char(11),unique(idcard,phonenumber))
意思; 身份证 和 手机号码 都相同 才叫相同 >>才会报错
四. primary key ******(
主键约束;用于唯一标识表中的一条记录
如何能做到唯一标识 该字段 只要是唯一的 且不能为空
也就是说主键约束 和 (非空 not null 加 唯一约束 unique ) 没有区别
他们之间的区别是?
唯一约束:是一种索引 必然存在于硬盘上的某个文件,是物理层面(实实在在存在的)
primary key 是一种逻辑意义上的数据(实际不存在)
换句话说 主键就是有 唯一约束 和 非空约束 组成的约束
语法:
create table stu(stuid int primary key,name char(3));
create table t7(id int unique not null ,name char(3));
有主键和没主键的区别? primary key
1. 无法区分两个相同的记录 比如班级里面有两个名字相同
2.有主键 意味着有索引 查询速度快
3.可以建立关联关系
多列联合主键;
create table t7(id int ,name char(3),primary key(id,name));
要不要主键?
必须的 每个表都用该有主键 哪怕不用唯一标识 也应该考虑提升效率
主键的字段名 几乎都叫 id
同一个表中可不可以有多个主键?
不可以 没有任何意义
建议:主键的类型基本上为整型(******)
练习:
创建一个员工表 (员工信息: 员工编号 姓名 年龄 性别)
create table employee values(id int primary key ,name char(10) not null,age int not null ,sex char(10) default "man");
insert into employee(id name age) values(1,"jxl",18,),(2,"egon",20),(3,"lxx",18),
问题: 可能忘记上一次的id到第几了 导致你要先看一会 影响开发效率
五. auto_increment *******
中文 自动增长
作用 : 通常搭配主键字段使用 可以自动为你的数据分配主键
如何添加;
添加一天就自动加一 计数从1开始
语法:
create table t1(id int primary key auto_increment,name char(10));
insert into t1(name) values("yyy"),("egon"),("lxx")
insert into t1 values(null,"yyy"),(null,"egon"),(null,"lxx")
修改自动增长其起始位置:
alter table t1 auto_increment =3
注意: 自动增长 只能用于整型
六. froeign key *******
专门用于为表和表之间建立物理关系
在查找表之间的关系时 要站在不同表去思考:
1.从元员工出发: 多个员工 对应一个部门
2.从部门出发:一个部门对应多个员工
如果两个得到的关系不同 择认为:多对一的关系是单向的
练习一: 部门 员工(多对一)
1. 先创建部门表:
create table dept(id int primary key auto_increment, name char(10),manager cahr(10));
coinsert into dept value(null,'教学部','egon')
2.再创建员工表:
create table emp(id int primary key auto_increment,name char(10),dept_id int ,foreign key(dept_id) references dept(id));
insert into emp value(null ,"egon",1)
练习二: 学员 班级 关系 (多对一)
1. 创建班级;
create table class(id int primary key auto_increment ,name char(10),manager char(10));
insert into class value(null,"python 全栈开发","egon");
insert into class value(null,"linux运维开发","egon");
2.创建学员;
create table stud(id int primary key auto_increment ,name char(10),sex char(3),class_id int, foreign key(class_id) references class(id));
insert into stud value(null,"jxl",1)
总结(注意):
添加约束外键时:
被关联的表需要先被创建,主表数据应该先被插入,
部门数据(主表)用该先插入 员工数据(从表)应该后插入
在删除数据前(主表)前 要保证该部门的员工数据都被删除了
在更新部门编号前 先要保证没有员工关联这个部门
问题: 外键加上以后 主表中的数据 删除 更新 都受到限制
解决方案: 为外键添加 级联操作
级联操作:
指的是同步更新和删除
语法:在创建外键时 在后面添加:
on update cascade :同步更新
on delete cas.cade :同步删除
实例:
班级:create table class(id int primary key auto_increment ,name char(10),manager char(10));
学生:create table stud(id int primary key auto_increment ,name char(10),sex char(3),class_id int, foreign key(class_id) references class(id) on update casecade on delete casecade );
多对多关系: 建立一个中间表 专门用来查询两个表的关系
需求: 要能找出来 那些老教过那些学生 那些学生被那些老师教过
学生表:
create table stud(id int primary key auto_increment ,name char(10),sex char(10))
insert into stud valu(null, "jxl","man")
老师表:
create table teacher(id int primary key auto_increment ,name char(10),sex char(10))
insert into stud valu(null, "egon","man")
中间表: 关系表
create table t_s(t_id int ,
s_id int ,
froeign key(t_id) references teacher(id),
froeign key(s_id) references stud(id),
primary key(t_id,s_id) 9
)