MySQL学习5——外键续
## 一对多补充
# 级联删除 (当一张表删除记录时,若绑定给了另一张表中的外键,则一同删除另一张表中关联的记录)
# 更新于删除都需要考虑到关联与被关联的关系>>>同步更新与同步删除
# 被关联表 create table dep( id int primary key auto_increment, dep_name char(10), dep_comment char(60) ); # 关联表 create table emp( id int primary key auto_increment, name char(16), gender enum('male','female') not null default 'male', dep_id int, foreign key(dep_id) references dep(id) # 级联更新(同步更新) on update cascade # 级联删除(同步删除) on delete cascade );
# 先插入被关联表数据
insert into dep(dep_name,dep_comment) values
('教学部','教授python课程'),
('外交部','上海校区形象大使'),
('技术部','技术能力部门');
# 再插入关联表数据
insert into emp(name,gender,dep_id) values
('a','male',1),
('b','male',2),
('c','male',1),
('d','male',1),
('e','female',3);
# 查看两张表数据
select * from emp;
select * from dep;
# 删除部门后,对应的部门里面的员工表数据对应删除
delete from dep where id=3;
# 更新部门后,对应员工表中的标示部门的字段同步更新
update student set sid=3 where sid=2;
## 多对多
# 建立第三张表,该表中有一个字段fk左表的id,还有一个字段是fk右表的id
# 1) 先创建作者表 create table author( id int primary key auto_increment, name char(16) ); # 2) 创建图书表 create table book( id int primary key auto_increment, bname char(16), price int ); # 3) 创建第三张关联表 create table author2book( 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 );
## 一对一
# 左表的一条记录唯一对应右表的一条记录,反之也一样
# 被关联表 create table customer( id int primary key auto_increment, name char(20) not null, qq char(10) not null, phone char(16) not null ); # 关联表 create table student( id int primary key auto_increment, class_name char(20) not null, customer_id int unique, # 注意: 该字段一定要是唯一的 foreign key(customer_id) references customer(id) #外键的字段一定要保证unique on delete cascade on update cascade );
# 三种外键关系都是用foreign key,区别在于如何使用以及其他条件限制即可做出三种关系
## 表的一些补充操作
1. 修改表名
ALTER TABLE 表名 RENAME 新表名;
2. 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…],
ADD 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
3. 删除字段
ALTER TABLE 表名 DROP 字段名;
4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
5.复制表结构+记录 (key不会复制: 主键、外键和索引)
create table 新的表名 select * from 已存在的表名
6.只复制表结构
create table 新表名 like 已存在的表名;