首页 SQL教程正文

【教程】表与表的关系

從出茳湖 SQL教程 2019-08-20 61 0

表与表的关系.png

表与表的关系    >>>思维导图>>>博客园

表与表之间的关系

所有信息都记录在一张表中所带来的问题

    1.表的结构不清晰

    2.浪费硬盘空间

    3.表的扩展性极差(无法忽略的缺点)

类似于我们将所有的代码都写在同一个py文件内

确立表与表之间的关系一定要换位思考(必须两方都考虑周全之后才能得出结论)

一对多关系

以员工表和部门为例

先站在员工表看,一个部门可以有多个员工

再站在部门表看,一个员工不能属多个部门

结论:员工表和部门表之间仅仅是单向的多对一,那么他们的表关系就是‘一对多’(表关系中没有多对一一说,只有一对多,无论是多对一还是一对多都叫‘一对多’)

外键

如何让两种表有代码层上真正的关联,就必须使用外键。

什么是外键?外键就是让表与表有硬性层上的关系

foreign key 外键约束

    1.在创建表的时候,必须先创建被关联表

    2.插入数据的时候,也必须先插入被关联表的数据

建表

create table dep(
        id int primary key auto_increment,
        dep_name varchar(32),
        dep_desc varchar(128)
    );

create table emp(
        id int primary key auto_increment,
        emp_name varchar(64),
        emp_gender enum('male','female','others') default 'male',
        dep_id int,
        foreign key(dep_id) references dep(id)	
    );

插入数据

insert into dep(dep_name,dep_desc) values('外交部','搞外交'),
('教学部','教书育人'),
('技术部','技术能力有限部门');

insert into emp(emp_name,dep_id) values('jason',1),
('egon',2),
('tank',2),
('kevin',3);

修改表数据

update dep set id=200 where id = 1;
update emp set dep_id = 300 where id = 1;
delete from dep where id = 3;

外键虽然能够帮你强制建立表关系 但是也会给表之间增加数据相关的约束

1.删除数据的时候  先删员工表的数据 再删部门表的数据

delete from emp where id = 4;
delete from dep where id = 3;

2.级联更新级联删除

create table dep(
        id int primary key auto_increment,
       dep_name varchar(32),
       dep_desc varchar(128)
    );
create table emp(
       id int primary key auto_increment,
       emp_name varchar(64),
       emp_gender enum('male','female','others') default 'male',
       dep_id int,
       foreign key(dep_id) references dep(id) 
       on update cascade 
       on delete cascade
   );
insert into dep(dep_name,dep_desc) values('外交部','搞外交'),
       ('教学部','教书育人'),
       ('技术部','技术能力有限部门');
insert into emp(emp_name,dep_id) values('jason',1),
       ('egon',2),
       ('tank',2),
       ('kevin',3);

update dep set id=200 where id = 3;
delete from dep where id = 2;

多对多

案例:图书表与作者表

站在图书表来看,一个作者能写多本图书

站在作者表来看,一本书可以有多个作者

如果双方都可以,那么就是多对多

强调foreign key只是用来帮你建表关系的,不是某个关系特有的方法

注意:多对多关系的建立必须手动创建第三张表,用来专门记录两种表之间的关系

建表

# 先建两种普通的表  不需要设置外键
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,
        book_id int,
        foreign key(book_id) references book(id)
        on update cascade
        on delete cascade,
        author_id int,
        foreign key(author_id) references author(id)
        on update cascade
        on delete cascade
    );

插入数据

insert into book(title,price) values('金瓶梅',199),('聊斋',299),('jason教你删别人的库,让别人跑去吧',1);
insert into author(name,age) values('jason',18),('tank',38);
insert into book2author(book_id,author_id) values(4,3);  # 报错
insert into book2author(book_id,author_id) values(1,1),(1,2),(2,1),(3,1),(3,2);

一对一

一对一的场景,当你的表特别庞大的时候,你可以考虑拆分表

案例:腾讯视频用户和会员

当你没有交费之前,你是腾讯视频的用户

当你交费之后,你就变成了腾讯视频的会员

不是所有的客户都能变成会员

建表

# 左表的一条记录唯一对应右表的一条记录,反之也一样
create table user(
    id int primary key auto_increment,
    name char(20) not null,
    qq char(10) not null,
    phone char(16) not null
);
create table vip(
    id int primary key auto_increment,
    vip_class int not null,
    user_id int unique,  # 该字段一定要是唯一的
    foreign key(user_id) references user(id)  # 外键的字段一定要保证unique
    on delete cascade
    on update cascade
);
# 三种外键关系都是用foreign key,区别在于如何使用以及其他条件限制即可做出三种关系

外键字段

通常将关系字段称之为外键字段

    1.一对多的外键字段,建在多的一方

    2.多对多的外键字段,建在第三张表

    3.一对多的外键字段,建在任意一方都可以,但是推荐你建在查询频率较高的一方

	create table authordetail1(
			id int primary key auto_increment,
			phone int,
			addr char(255)
	);

	create table author1(
		id int primary key auto_increment,
		name char(4),
		age int,
		authordetail_id int unique,
		foreign key(authordetail_id) references authordetail1(id)
		on update cascade
		on delete cascade
	);

判断表关系的最简单的语法

图书与出版社

一本书可不可以有多个出版社  不可以!!!
一个出版社可不可以出版多本书  可以!!!
一对多的关系

图书与作者表

一本书可不可以有多个作者    可以!!!
一个作者可不可以写多本书     可以!!!
多对多的关系

作者与作者详情

一个作者可不可以有多个详情  不可以!!!
一个作者详情可不可以有多个作者  不可以!!!
 要么两者是一对一
要么两者之间没任何关系

表的相关操作

修改表

# mysql对大小写不敏感!!!
语法:
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 旧字段名 新字段名 新数据类型 [完整性约束条件…];

复制表

# 查询语句执行的结果也是一张表,可以看成虚拟表

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

# 只复制表结构
select * from service where 1=2;        //条件为假,查不到任何记录

create table new1_service select * from service where 1=2;  

create table t4 like employees;


本文标题:【教程】表与表的关系
本文链接:https://zhong-er.com/post/68.html
作者授权:除特别说明外,本文由 從出茳湖 原创编译并授权 中二青年 刊载发布。
版权声明:本文使用「署名-非商业性使用-相同方式共享 4.0 国际」创作共享协议,转载或使用请遵守署名协议。

评论

本站会员尊享VIP特权,现在就加入我们吧!登录注册
登录
用户名
密码
注册
用户名
密码
确认密码
邮箱
获取邀请码
邀请码
验证码
找回密码
用户名
邮箱
※ 重置链接将发送到邮箱