外键及修改复制表操作

外键

外键:用来建立两张表之间的关系

研究表与表之间的关系:

​ 1、定义一张员工部门表

​ 2、将所有的数据都存放在一张表里的问题

  • 结构不清晰
  • 浪费空间
  • 可扩展性极差,类似于所有的代码放到一个py文件中,耦合度高

​ 3、所有用拆分表来解决以上问题

​ 4、拆分表后需要给两张表建立一种关系,这就需要用到外键来建立连接

如何确定表与表之间的关系是:一对多、多对多、一对一

1、一对多

注意:在MySQL中没有多对一,只有一对多

站在两张表的位置去思考,凡是单向的多对一 的表的关系,称之为 一对多 的外键关系

外键语法:foregin key(当前表中建立关系的外键字段) references 被关联表名(id)

创建两张表,必须先创建被关联表,再创建关联表(外键设置在关联表中,一对多中的多的关联表中

被关联表: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;

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;

3、一对一

将一张数据量比较大的表拆分为两张表

一 一对应的关系——》一对一的外键关系

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;

修改表的操作

1、修改表名

alter table 表名 rename 新表名;

2、增加字段

添加到最后一列

alter table 表名 add 字段名 数据类型 [完整性约束条件],add 字段名 [完整性约束条件];

添加到第一列

alter table 表名 add 字段名 数据类型 [完整性约束条件] first;

添加到某一列之后

alter table 表名 add 字段名 数据类型 [完整性约束条件] after;

3、删除字段

alter table 表名 drop 字段名;

4、修改字段

修改数据类型

alter table 表名 modify 字段名 数据类型 [完整性约束条件];

修改字段名,保留字段类型

alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束条件];

修改字段名与字段类型

alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件];

复制表操作

复制表结构 + 记录(key不会被复制:主键、外键、索引)

create table 新表名 select * from 旧表名;

只复制表结构

create table 新表名 select * from 旧表名 where 1=2;

posted @ 2019-12-12 18:34  Mr沈  阅读(610)  评论(0编辑  收藏  举报