MySQL学习笔记(2)之外键、表的关系
1.外键
''' 外键就是用来帮助我们建立表与表之间关系的 foreign key '''
2.表的关系
表与表之问最多只有四种关系
一对多关系
多对多关系
一对一关系
没有关系
1)一对多关系
#外键字段建在夺得一方
#一定先创建被关联的表(dep)
#录入数据的时候也必须先录入被关联表
'''
'''
级联更新和删除
create table dep(
id int primary key auto_increment,
dep_name char (16),
dep_desc char(32)
);
create table emp(
id int primary key auto_increment,
name char(16),
gender enum('male','female','others') default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
on delete cascade on update cascade
);
'''
2)多对多
'''
需要单独创建一张表存储两张表的关系
修改一张表的时候另一张表不变化,变化的是第三张表(存放两个表关系的表)
'''
create table book(
id int primary key auto_increment,
title varchar(32),
price int
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int
);
create table book2author(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id) on delete cascade on update cascade,
foreign key(book_id) references book(id) on delete cascade on update cascade
);
3)一对多
'''
如果一个表的字段特别多 每次查询又不是所有的字段都能用到,将一个表一分为二
用户表
用户详情表
站在用户表
一个用户能否对应多个用户详情 不能!!!
站在详情表一个详情能否属于多个用户 不能!!!
结论:单向的一对都都不成立那么这个时候两者之间的表关系就是一对一或者没有关系
一般外键字段建在查询频率高的表中(用户表)
'''
create table authordetail(
id int primary key auto_increment,
phone int,
addr varchar(64)
);
create table author1(
id int primary key auto_increment,
name varchar(32),
age int,
authordetail_id int unique,
foreign key(authordetail_id) references authordetail(id) on delete cascade on update cascade
);
PS
1.修改表名
'''
1.修改表名
alter table 表名 rename 新表名
2.增加字段
alter table 表名 add 字段名 字段类型(宽度) 约束条件; (默认在末尾加)
alter table 表名 add 字段名 字段类型(宽度) 约束条件 first;
alter table 表名 add 字段名 字段类型(宽度) 约束条件 after 字段名;
3. 删除字段
alter table 表名 drop 字段名;
4.修改字段
alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
alter table 表名 change 旧字段名 新段类型(宽度) 约束条件;
'''
2.复制表
'''SQL语句查询的是一张虚拟表
'''
create table 表名 select *from 旧表; # 不能复制主键 外键。。。
create table 表名 select *from 旧表 where id>3;