外键:用来创建两张表之间的关系mysql
研究表与表之间的关系:sql
一、定义一张员工部门表3d
二、将全部的数据都存放在一张表里的问题code
三、全部用拆分表来解决以上问题blog
四、拆分表后须要给两张表创建一种关系,这就须要用到外键来创建链接索引
如何肯定表与表之间的关系是:一对多、多对多、一对一rem
注意:在MySQL中没有多对一,只有一对多it
站在两张表的位置去思考,凡是单向的能 多对一 的表的关系,称之为 一对多 的外键关系table
外键语法:foregin key(当前表中创建关系的外键字段) references 被关联表名(id)class
建立两张表,必须先建立被关联表,再建立关联表(外键设置在关联表中,一对多中的多的关联表中)
被关联表:dep
create table dep(id int primary key auto_increment, dep_name varchar(20), dep_desc varchar(255));
关联表:emp
create table emp(id int primary key auto_increment, name varchar(16), age int, sex enum('male','female'), dep_id int, foreign key(dep_id) references dep(id));
插入数据,必须先插入被关联表的数据,再插入关联表的数据
被关联表:dep
insert into dep(dep_name,dep_desc) values('财务部','发工资'),('人事部','招人才'),('技术部','干活');
关联表:emp
insert into emp(name,age,sex,dep_id) values('小李','40','female',1),('小王','35','male',3),('小张','28','male',3),('小王','24','female',2);
插入被关联表id以外的数据,会报错,插不进去
insert into emp(name,age,sex,dep_id) values('vicky','24','female',4);
更新数据与删除数据
直接更新关联表或被关联表中的数据会报错,须要先删除被关联表中的记录
删除:须要先删除关联表中的记录再删除被关联表中的记录
每次更新或删除都很麻烦,因此在建立关联表时用级联更新,级联删除
级联更新与级联删除
级联更新:on update cascade
级联删除:on delete cascade
被关联表:dep
create table dep1(id int primary key auto_increment, dep_name varchar(20), dep_desc varchar(255));
关联表:emp
create table emp1(id int primary key auto_increment, name varchar(16), age int, sex enum('male','female'), dep1_id int, foreign key(dep1_id) references dep1(id) on update cascade on delete cascade);
被关联表:dep
insert into dep1(dep_name,dep_desc) values('财务部','发工资'),('人事部','招人才'),('技术部','干活');
关联表:emp
insert into emp1(name,age,sex,dep1_id) values('小李','40','female',1),('小王','35','male',3),('小张','28','male',3),('小王','24','female',2);
更新数据:
update dep1 set id = 8 where id=1;
删除数据:
delete from emp1 where id=2;
delete from dep1 where id=2;
也必须站在两张表的位置去思考,凡是双向的能 多对一 的表的关系,称之为 多对多 的外键关系
多对多直接创建两张表,没法知道,哪张表是被关联表,利用第三张表为两张表创建“多对多的外键关系”
被关联表:book
create table book(id int primary key auto_increment, title varchar(20), price int);
关联表:author
create table author(id int primary key auto_increment, name varchar(18), age int);
第三方表:book_author
create table book_author(id int primary key auto_increment, book_id int, author_id int, foreign key(book_id) references book(id) on update cascade on delete cascade, foreign key(author_id) references author(id) on update cascade on delete cascade);
插入数据:
insert into book(title, price) values('三体8',200),('活着8',48); insert into author(name,age) values('Mr沈',18),('tate',20);
插入关联表数据:
insert into book_author(book_id,author_id) values(1,1),(1,2),(2,1),(2,2);
若是插入不在book id或author id以外的数会报错
insert into book_author(book_id,author_id) values(3,2);
更新与删除
更新:
update book set price=688 where id=1; update author set id=4 where id=2;
删除:
delete from author where id=4;
将一张数据量比较大的表拆分为两张表
一 一对应的关系——》一对一的外键关系
foreign key应该创建在使用频率较高的一方,关联外键必须设置惟一
建立被关联表:customer
create table customer(id int primary key auto_increment, name varchar(18), media varchar(40));
建立关联表:student
create table student(id int primary key auto_increment, addr varchar(40), phone char(11), customer_id int unique, foreign key(customer_id) references customer(id) on update cascade on delete cascade);
插入数据
insert into customer(name,media) values('Mr沈','facebook'),('vicky','ig'),('tate','vk'); insert into student(addr,phone,customer_id) values('上海','13211934021',1),('南京','19322218302',2),('北京','18312873652',3);
插入的数据必须一一对应,不然会报错
insert into student(addr,phone,customer_id) values('上海','12609217331',1);
更新和删除数据
更新数据:
update customer set name='tank' where id=1;
删除数据:
delete from student where id=1;
alter table 表名 rename 新表名;
添加到最后一列
alter table 表名 add 字段名 数据类型 [完整性约束条件],add 字段名 [完整性约束条件];
添加到第一列
alter table 表名 add 字段名 数据类型 [完整性约束条件] first;
添加到某一列以后
alter table 表名 add 字段名 数据类型 [完整性约束条件] after;
alter table 表名 drop 字段名;
修改数据类型
alter table 表名 modify 字段名 数据类型 [完整性约束条件];
修改字段名,保留字段类型
alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束条件];
修改字段名与字段类型
alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件];
复制表结构 + 记录(key不会被复制:主键、外键、索引)
create table 新表名 select * from 旧表名;
只复制表结构
create table 新表名 select * from 旧表名 where 1=2;