MySQL数据库03
自增特性
create table t1( id int primary key auto_increment, name varchar(32) ); insert into t1(name) values('jason'),('kevin'),('tony'); insert into t1(name) values('oscar'); # id=4 delete from t1 where id=4; insert into t1(name) values('oscar'); # id=5
自增不会随着数据的删除而回退!!!
delete from t1; # 删除数据但无法重置主键 insert into t1(name) values('jason'),('kevin'),('tony'); truncate t1; # 删除数据并重置主键值 insert into t1(name) values('jason'),('kevin'),('tony');
外键引入
''' 创建一张员工表 id name age dep_name dep_desc 缺陷: 1.表的重点不清晰(可以忽略) 既可以说是员工表也可以说是部门表 2.表中某些字段对应的数据一直在重复(可以忽略) 浪费存储空间 3.表的扩展性极差 牵一发而动全身(不能忽略) 耦合度太高 不利于维护 解决: 将一张表一分为二 员工表 部门表 id name age id dep_name dep_desc ''' ''' 拆分之后,员工与部门之间没有了绑定关系; 在员工表中添加一个部门编号字段与部门表中的主键字段对应; 这个字段就是外键,因此引入了外键的概念 '''
社会中存储需要可以构建成表的数据, 它们形成的表,往往之间存储某种或某些社会关系,mysql数据库建立表结构就是社会中产生的各种数据,,分门别类管理但mysql建立的(代码层次的)表之间,,同样需要处理表与表之间的关系,形成了 多对一 、多对多 、一对一的关系。
外键字段就是用来记录表与表之间数据的关系。
外键关系
外键关系总共分为三种:一对多;多对多;一对一。
note:关系表达只能用一对多,不能用多对一。
外键关系的判断方法:换位思考,即:思考两个表格数据之间的''【一对多】''的对应关系。
-
一对多:外键字段建在多的一方
一个员工对应一个部门,但是一个部门可以对应多个员工。
create table emp( id int primary key auto_increment comment '编号', name varchar(32) comment '姓名', age int comment '年龄', dep_id int comment '部门编号', foreign key(dep_id) references dep(id) ); create table dep( id int primary key auto_increment comment '编号', dep_name varchar(32) comment '部门名称', dep_desc varchar(32) comment '部门描述' ); 在创建表字段的时候也可以给每个字段添加中文注释:comment '中文注释'
外键关键字:
foreign key(dep_id) references dep(id)
foreign key的约束效果:
- 创建表的时候,应该先创建被关联表(没有外键字段的表)
- 插入数据的时候,应该先插入被关联表(没有外键字段的表);外键字段填入的值只能是被关联表中已经存在的值
- 修改、删除被关联表数据都会出现障碍(是不被允许的)
级联更新和级联删除:
要想打破这种约束效果,实现表数据之间的联动,需要使用级联更新和级联删除方法。
create table emp1( id int primary key auto_increment comment '编号', name varchar(32) comment '姓名', age int comment '年龄', dep_id int comment '部门编号', foreign key(dep_id) references dep1(id) on update cascade # 级联更新 on delete cascade # 级联删除 ); create table dep1( id int primary key auto_increment comment '编号', dep_name varchar(32) comment '部门名称', dep_desc varchar(32) comment '部门描述' );
ps:
在实际工作环境中,外键也可能不会使用,因为外键会消耗额外的资源,并且会增加表的复杂度;
表很多的情况下,我们也可以通过SQL语句的形式建立逻辑意义上的表关系。
-
多对多:外键字段重新建立一个存储表关系的表格数据
create table book( id int primary key auto_increment, title varchar(32), price float(10,2) ); create table author( id int primary key auto_increment, name varchar(32), gender enum('male','female','others') ); create table book2author( id int primary key auto_increment, author_id int, book_id int, foreign key(author_id) references author(id) on update cascade # 级联更新 on delete cascade, # 级联删除 foreign key(book_id) references book(id) on update cascade # 级联更新 on delete cascade # 级联删除 );
ps:
两张基表内的数据没有在第三张表内绑定关系的情况下,是可以随意进行增、改、删等操作的。
-
一对一:外键字段建在任意一方都可以,但是推荐建在查询频率较高的较好的基表那一方
create table User( id int primary key auto_increment, name varchar(32), gender enum('male','female','others'), user_detail_id int unique, # 好好体会为什么加unique foreign key(user_detail_id) references UserDetail(id) on update cascade # 级联更新 on delete cascade, # 级联删除 ); create table UserDetail( id int primary key auto_increment, phone bigint, age int );