一对多

定义一张部门员工表

id

name

gender

dep_name

dep_desc

1

yzy

male

教学部

教书育人

2

yolo

male

外交部

形象大使

3

zmm

female

教学部

教书育人

4

czh

male

教学部

教书育人

5

lc

male

技术部

技术能力有限部门

把所有数据都存放于一张表的弊端

1.组织结构不清晰

2.浪费硬盘空间

3.扩展性极差

上述的弊端产生原因类似于把代码全部写在一个py文件中,应该怎么做?  >> 解耦合!

将上述两张表拆成员工的部门两张表

分析表数据之间的关系:多个员工对应一个部门,一个部门对应多个员工.禁止一个员工对应多个部门

如何查找表与表之间的关系

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

  以员工表和部门表为例

    先站在员工表看能否有多个员工对应一个部门

      翻译过来:一个部门对应多个员工(可以!!!)

      (暂时只能确定员工单向多对一部门)

    再站在部门表看能否有多个部门对应一个员工

      翻译过来:一个员工能否属于多个部门(不可以!!!)

  结论:员工表和部门表之间仅仅是单向的多对一.那么它们的关系就是"一对多"

  表关系中没有多对一一说,只有一对多

oceanbase建表语句与mysql区别 mysql建立表与表之间的关系_表名

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

foreign key 

  外键约束

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

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

建表

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

create table staff(id int primary key auto_increment,
        stf_name varchar(16),
        stf_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 staff(stf_name,dep_id) values('yyy',1),
('qqq',2),
('www',2),
('rrr',3);
修改表数据
 
update dep set id=200 where id=1;
update staff set dep_id=200 where id=1;

delete from dep where id=3;

外键虽然能够强制建立表关系  但是也会给表之间增加数据相关的约束
1.删除数据的时候   需要先删员工表的数据  在删部门表的数据
    delete from staff where id=2;
    delete from dep where id=2;
2.级联更新级联删除
create table dep(id int primary key auto_increment,
                dep_name varchar(16),
                dep_desc varchar(32)
                );
                        
create table staff(id int primary key auto_increment,
                stf_name varchar(16),
                stf_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 staff(stf_name,dep_id) values('yyy',1),
('qqq',2),
('www',2),
('rrr',3);

多对多

图书表与作者表

  先站在图书表

    多本书能否有多个作者 <==> 一个作者能否写多本书    可以!!!

  再站在作者表

    多个作者能否写一本书 <==>一本书能否有多个作者     可以!!!

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

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

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

oceanbase建表语句与mysql区别 mysql建立表与表之间的关系_外键_02

 

先建两张普通的表  不需要设置外键

create table book(id int primary key auto_increment,
                book_name varchar(16),
                book_desc varchar(128),
                price int
            );
            

create table author(id int primary key auto_increment,
                name varchar(16),
                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(book_name,book_desc,price) values('哪吒','风火轮',100),('孙悟空','金箍棒',200),('猪八戒','九齿钉耙',10);
            
insert into author(name,age) values('yzy',19),('yolo',19);

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);

一对一表关系

oceanbase建表语句与mysql区别 mysql建立表与表之间的关系_表名_03

建表

create table peopledetail(id int primary key auto_increment,
                        phone int,
                        addr varchar(128)
                        );

create table people(id int primary key auto_increment,
                    name varchar(16),
                    age int,
                    peopledetail_id int unique,
                    foreign key(peopledetail_id) references peopledetail(id)
                    on update cascade
                    on delete cascade
                    );
                    

insert into peopledetail(phone,addr) values(110,'火星'),(120,'水星'),(190,'地球');
insert into people(name,age,peopledetail_id) values('yzy',19,1),('yolo',19,2),('zmm',19,3);

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

一对多的外键字段  建在多的一方

多对多   建在第三张表里

一对一  外键字段建在任意一方都可以  (推荐建在查询频率较高的一方)

oceanbase建表语句与mysql区别 mysql建立表与表之间的关系_表名_04

oceanbase建表语句与mysql区别 mysql建立表与表之间的关系_外键_05

图书与出版社
    一本书可不可以有多个出版社  不可以!!!
    一个出版社可不可以出版多本书  可以!!!
    一对多的关系
        
        
    图书与作者表
        一本书可不可以有多个作者    可以!!!
        一个作者可不可以写多本书     可以!!!
            多对多的关系
        
        
    作者与作者详情
        一个作者可不可以有多个详情  不可以!!!
        一个作者详情可不可以有多个作者  不可以!!!
        要么两者是一对一
        要么两者之间没任何关系

判断表关系最简单的语法

修改表的完整语句

1.修改表的完整语句
    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 旧字段名 新字段名 新数据类型 [完整性约束条件…];
# 查询语句执行的结果也是一张表,可以看成虚拟表

    # 复制表结构+记录 (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;