day 35
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 )