外键、表与表之间的关系

六眼飞鱼酱① 提交于 2020-01-30 22:50:26

今日学习总结:

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

         外键的约束的条件:

        需要先提前建立被关联表

        级联更新级联删除

        1、一对多
        2、多对多
        3、 一对一

 注意:mysql中 没有 多对一

         1. 一对多

            01、创建两张表:必须先建立被关联表,再建立关联表

dep:                                                               # 被关联表:
create table dep(
id int primary key auto_increment,               # 主键+自增
dep_name varchar(16),
dep_desc varchar(255)
);

emp:                                                            # 关联表:
create table emp(
id int primary key auto_increment,
name varchar(16),
age int,
gender enum('male', 'female', 'others') default 'male',
dep_id int not null,
foreign key(dep_id) references dep(id)       # 外键:foreign key(dep_id)   。references dep  表示关联 被关联表

             02、插入数据: 必须先插入被关联表(dep)的数据,再插入关联表(emp)的数据

# dep:
insert into dep(dep_name, dep_desc) values('nb_外交部', '国际形象大使部门'),
('sb_教学部', '造程序员部门!!!!'),
('技术部', '技术有限部门');

# emp:
insert into emp(name, age, gender, dep_id)
values('tank', 17, 'male', 1),
('jason', 70, 'male', 2),
('sean', 50, 'male', 2),
('egon', 88, 'male', 2),
('owen', 95, 'female', 3);

 

# 报错,
insert into emp(name, age, gender, dep_id) values('大饼', 100, 'others', 999);        # dep_id 中没有999

         03、更新数据

# 报错
update emp set dep_id=100 where id=2;
# 报错
update dep set id=100 where id=1;

# 先删除已关联表中,关联的dep_id字段,才能修改被关联表 dep表中的关联id字段。
delete from emp where id=1;
update dep set id=100 where id=1;

         04、删除数据:删除: 先删除 关联表 中的记录,再删除 被关联表 中的记录

- 删除emp表中的dep_id为2的记录
delete from emp where dep_id=2;

- 再删除dep表中id为2的记录
delete from dep where id=2;

       2、级联更新与级联删除   

            on update cascade            # 级联更新
            on delete cascade             # 级联删除

            01、创建两张表
dep2:                                            # 被关联表:
create table dep2(
id int primary key auto_increment,
dep_name varchar(16),
dep_desc varchar(255)
);


emp2:                                          # 关联表:
create table emp2(
id int primary key auto_increment,
name varchar(16),
age int,
gender enum('male', 'female', 'others') default 'male',
dep_id int not null,
foreign key(dep_id) references dep2(id)
on update cascade                                        # 级联更新
on delete cascade                                         # 级联删除
);

       02、插入数据

# dep:
insert into dep2(dep_name, dep_desc) values('nb_外交部', '国际形象大使部门'),
('sb_教学部', '造程序员部门!!!!'),
('技术部', '技术有限部门');

# emp:
insert into emp2(name, age, gender, dep_id)
values('tank', 17, 'male', 1),
('jason', 70, 'male', 2),
('sean', 50, 'male', 2),
('egon', 88, 'male', 2),
('owen', 95, 'female', 3);

# 报错,
insert into emp(name, age, gender, dep_id) values('大饼', 100, 'others', 999);

        03、更新数据

update dep2 set id=200 where id=1;                 # 改变 被关联表 中的数据,关联表 中的数据也同时改变

       04、删除记录
delete from dep2 where id=200;                      # 删除 被关联表 中的数据,关联表 中的数据也同时删除

         3、多对多:利用第三张表,为两张表建立“多对多外键关系”

         01、创建三张表

- book:
create table book(
id int primary key auto_increment,
title varchar(20),
price int,
book_content varchar(255)
);

- author:
create table author(
id int primary key auto_increment,
name varchar(16),
age int
);


- book2author:
create table book2author(
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
);

      02、插入数据

- book
insert into book(title, price, book_content) values
('金瓶mei', 199, '讲述朦胧时光的小故事'),
('python从入门到断气', 2000, '学习如何一夜秃头'),
('三体', 200, '跟着大佬进入宇宙奇幻世界')
;

- author
insert into author(name, age) values
('egon', 68),
('jason', 88);

- book2author:
insert into book2author(book_id, author_id) values
(1, 1),
(1, 2),
(2, 2),
(3, 1);

         03、更新数据

- update book set price=6666 where id=1;
- update book set id=4 where id=1;

        04、删除数据

- delete from book where id=4;

       4、一对一:两张之间的关系 一一对应,将一张数据量比较大的表,拆分成两张表。  foreign key 应该建在 使用频率较高的一方。

        01、创建表
# 被关联表
create table customer(
id int primary key auto_increment,
name varchar(16),
media varchar(32)
);


# 关联表
create table student(
id int primary key auto_increment,
addr varchar(255),
phone char(11),
id_card char(18),

# 外键必须设置为唯一的
customer_id int unique,
foreign key(customer_id) references customer(id)
on update cascade
on delete cascade
);

     02、插入数据

insert into customer(name, media) values
('hcy', 'facebook'),
('zsb1', 'ig'),
('zsb2', 'vk'),
('hb', '探探');

insert into student(addr, phone, id_card, customer_id) values
('上海', '15214546711', '440888888888888888', 1),
('北京', '18888888888', '440777777777777777', 2);

# 报错,一对一,关系必须 一一对应
insert into student(addr, phone, id_card, customer_id) values ('上海', '15214546711', '440888888888888888', 1);

二、修改表的操作

注意:mysql 关键字不区分大小写

1. 修改表名
ALTER TABLE 表名      #alter table
RENAME 新表名;         #rename

2. 增加字段
ALTER TABLE 表名    #alter table
ADD 字段名 数据类型 [完整性约束条件…],
ADD 字段名 数据类型 [完整性约束条件…]; # 添加到最后一列

ALTER TABLE 表名    # alter table
ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 添加到第一列

ALTER TABLE 表名    # alter table
ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 添加到某一列之后

3. 删除字段
ALTER TABLE 表名   # alter table
DROP 字段名;

4. 修改字段
ALTER TABLE 表名   # alter table
MODIFY 字段名 数据类型 [完整性约束条件…]; # 修改数据类型  modify

ALTER TABLE 表名   # alter table
CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; # 修改字段名,保留字段类型 change 

ALTER TABLE 表名   # alter table
CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…]; # 修改字段名与字段类型 change

三、复制表的操作:

1、复制表结构+记录 (key不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;

2、只复制表结构 
# 将select * from service where 1=2; ---> 不要真实数据,需要表结构‘
mysql> create table new_customer select * from customer where 1=2;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!