精华内容
下载资源
问答
  • 今天核心的内容就是怎样让之间产生关系,在思考这个问题的时候,我们可以回顾之前学习python时,当一个任务涉及到很多的功能时,我们为了让程序的结构更清晰,扩展性更高,我们选择用函数>>模块>>...

    引子:如下图是一张非常寻常的表格,在以前的工作中实常会制作类似的表格,但是今天的数据库内容,将我之前这种传统的制表思路上升了一个层次;

    今天核心的内容就是怎样让表与表之间产生关系,在思考这个问题的时候,我们可以回顾之前学习python时,当一个任务涉及到很多的功能时,我们为了

    让程序的结构更清晰,扩展性更高,我们选择用函数>>模块>>包 的方式将功能层层拆分,最终让程序结构上升到新的层次,而且极大的降低了代码的冗

    余。再回到这张表,如果说总共就这几个人,这张表没什么问题,但是假设我们拥有100w的用户,此时表中的 def_name,dep_desc就有些冗余了;此外

    这种表的形式也非常不利于后期数据的取值和修改。

    8b5c2d35784d814fc3f9528eb4e692ff.png

    实现思路:把内容多出现重复的字段拎出来制作成具有id的新表,将两张表建立联系。

    第一步 拆分表

    298cd8f32f63e4bbf758ea645912fa08.png

    第二步 建立关联(通过dep_id字段链接两张表)

    da0daf482d29a6b756c5287b76eecf2e.png

    注意:1.必选要先建被关联表;

    2.新增数据的时候,要先增被关联表中的数据;

    create table dep(

    id int primary key auto_increment,#id设置为主建,自增

    dep_name char(16),

    dep_desc char(64) #注意最后一个括号后面一定不要加逗号!

    );

    create table emp(

    id int primary key auto_increment,

    name char(16),

    gender enum(‘male‘,‘female‘,‘others‘) not null default ‘male‘, #default后面的默认值空格直接书写即可

    dep_id int,

    foreign key(dep_id) references dep(id)#外键 本表中的dep_id 字段 ,关联dep表中的id字段;

    );

    插入数据

    2.新增数据的时候,要先增被关联表中的数据

    insert into dep(dep_name,dep_desc) values

    (‘外交部‘,‘形象代言人‘),

    (‘教学部‘,‘教书育人‘),

    (‘技术部‘,‘技术能力有限部门‘);

    insert into emp(name,gender,dep_id) values

    (‘jason‘,‘male‘,1),

    (‘egon‘,‘male‘,2),

    (‘kevin‘,‘male‘,2),

    (‘tank‘,‘male‘,2),

    (‘jerry‘,‘female‘,3);

    修改dep_id 数据

    update emp set dep_id=100 where id=1; #修改dep_id数据 结果报错。

    但我们可以选择先删除关联表中的数据后,再更改与其关联表emp中的字段。但这

    并不是最好的解决办法

    第三步 深度关联(修改/删除同步)on update cascade on delete cascade

    create table dep(

    id int primary key auto_increment,

    dep_name char(16),

    dep_desc char(64)

    );

    create table emp(

    id int primary key auto_increment,

    name char(16),

    gender enum(‘male‘,‘female‘,‘others‘) not null default ‘male‘, #default后面的默认值空格直接书写即可

    dep_id int,

    foreign key(dep_id) references dep(id)

    on update cascade#同步更新

    on delete cascade #同步删除

    );

    一对多,上面这个案例就是一对多的案例。

    多对多(第三张表牵线搭桥)

    当我们面对的是两张表互相之间都是多对一的情况,也就是多对多的情况时,就会出现互为外键,如果还是安装上面的方法创建,就会出现无法创建表的情况。此时我们需要第三张表来作为中间人,

    为两张表牵线搭桥,让它们产生关联。

    书与作者案例

    3344576ac6429b9232d9048c35327946.png

    多对多案例实现

    create table book(

    id int primary key auto_increment,

    title char(16),

    price int

    );

    create table author(

    id int primary key auto_increment,

    name char(16),

    gender char(16)

    );

    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 #同步删除

    );

    插入数据

    insert into book(title,price) values

    (‘瓶金梅‘,‘69.96‘),

    (‘围城‘,‘99.99‘),

    (‘python全栈开发‘,‘21000‘);

    insert into author(name,gender) values

    (‘jason‘,‘male‘),

    (‘egon‘,‘female‘),

    (‘kevin‘,‘male‘);

    insert into book2author(book_id,author_id) values

    (1,1),

    (1,2),

    (1,3),

    (2,1),

    (2,3),

    (3,1),

    (3,2);

    一对一

    修改表

    语法:

    1. 修改表名

    ALTER TABLE 表名

    RENAME 新表名;

    2. 增加字段

    ALTER TABLE 表名

    ADD 字段名  数据类型 [完整性约束条件…],

    ADD 字段名  数据类型 [完整性约束条件…];

    ALTER TABLE 表名

    ADD 字段名  数据类型 [完整性约束条件…]  FIRST;

    ALTER TABLE 表名

    ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;

    3. 删除字段

    ALTER TABLE 表名

    DROP 字段名;

    4. 修改字段

    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://www.cnblogs.com/guanchao/p/10862282.html

    展开全文
  • 外键就是用来帮助我们建立表之间关系的(绑定) 2.关系 之间最多只有四种关系 一对多关系MySQL关系中没有多对一一说 一对多 多对一 都叫一对多!!! 多对多关系 一对一关系 ...

    目录

    1.前言

    2.表与表关系

    1.一对多关系

    2.多对多关系:

    3.一对一关系

    3.对表总结:

    4.补充:

    1.修改表

     2.复制表


    1.前言

    1.方法:foreign key :外键
    	外键就是用来帮助我们建立表与表之间关系的(绑定)
    	
    2.表的关系
    	表与表之间最多只有四种关系
    	    一对多关系
    		    在MySQL的关系中没有多对一一说
    	    	一对多 多对一 都叫一对多!!!
    	    多对多关系
    	    一对一关系
    	    没有关系

    2.表与表关系

    1.一对多关系

    一对多关系
    1.思考路:
        换位思考  分别站在两张表的角度考虑
        判断表与表的关系
    
    2.foreign key使用过程中注意问题:
        (1).一对多表关系   外键字段建在多的一方
        (2).在创建表的时候 一定要先建被关联表(一,少的一方) 
        (3).在录入数据的时候 也必须先录入被关联表
    	
    3.foreign key只是绑定两表关系,容易查询
        若要改变一张表,另一个表也跟着变化,引入级联cascade做到同步
    
    4.语法:
        建dep身份职位表与emp成员表为例:
            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('teacher','teacher','teacher') default 'teacher',
    			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(name,dep_id) values('zcy',2),('mxg',1),('wsx',1),('lzr',3);

    2.多对多关系:

    1.思路:
        在使用foreign key时,注意点:要先建被关联表
        故:通过单独再开设一张 专门用来存储两张表数据之间的关系
    
    2.使用:
        建book图书表与author作者表为例:
    		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 update cascade                              # 同步更新(不用分号,是一句)
    			on delete cascade,                             # 同步删除
    			foreign key(book_id) references book(id) 
    			on update cascade                              # 同步更新
    			on delete cascade                              # 同步删除
    		);
            # 从上到下依次输入数据

    3.一对一关系

    1.思路:
        一对一关系,好比如一个表对应信息是另一个表的详细信息描述(一一对应)
        注意:一对一 外键字段建在任意一方都可以 但是推荐建在查询频率比较高的表中
    
    2.用法(客户表和学生表):
    	create table customer(
    		id int primary key auto_increment,
    		phone int,
    		addr varchar(64)
    	);
    	create table student(
    		id int primary key auto_increment,
    		name varchar(32),
    		age int,
    		student_id int unique,                                # 
    		foreign key(student_id) references customer(id) 
    		on update cascade                                          # 同步更新
    		on delete cascade                                          # 同步删除
    	)
        # 从上到下依次输入数据

    3.对表总结:

    1.表关系的建立需要用到foreign key
        一对多
            外键字段建在多的一方
        多对多
            自己开设第三张存储
        一对一
            建在任意一方都可以 但是推荐建在查询频率较高的表中
    
    2.判断表之间关系的方式
        换位思考!!!
            员工与部门
            图书与作者
            作者与作者详情

    4.补充:

    1.修改表

    MySQL对大小写是不敏感的
    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 new_dep2 select * from dep where id>3;
    展开全文
  • mysql表关系

    千次阅读 2021-01-19 23:33:19
    之间的关系"""把所有数据都存放于一张的弊端1.组织结构不清晰2.浪费硬盘空间3.扩展性极差"""#上述的弊端产生原因类似于把代码全部写在一个py文件中,你应该怎么做?>>>解耦合!将上述一张拆成...

    表与表之间的关系

    e534c632a0a6b65483d8a980e9270ba4.png

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

    1.组织结构不清晰

    2.浪费硬盘空间

    3.扩展性极差"""

    #上述的弊端产生原因类似于把代码全部写在一个py文件中,你应该怎么做?>>>解耦合!将上述一张表拆成员工和部门两张表!#类似的表关系学生与班级,也是如此,一张学生表和一张班级表

    ”””

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

    以员工表和部门表为例

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

    翻译过来:

    一个部门能否有多个员工

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

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

    翻译过来:

    一个员工能否属于多个部门

    不可以!!!

    结论:员工表和部门表之间仅仅是单向的多对一

    那么它们的表关系就是"一对多"表关系中没有多对一一说,只有一对多

    (无论是多对一还是一对多都叫"一对多")

    ””’

    外键

    """通过我们的分析我们可以得到把一张表拆成两张表之后它们概念上的联系,那么我们要如何让这两张表有在代码层面上的真正关联,那么就要用到外键。

    什么是外键?

    让表与表有硬性物理层面上的联系。

    foreign key

    外键约束

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

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

    一对多

    44bb2795e23a0ef70554e4bff1e01c8e.png

    #上代码来创建表#先建被关联表

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

    b24fc9cac6a0295efeed4f6a81489373.png

    #修改表的数据

    update dep set id=200 where id = 1;

    update emp set dep_id= 300 where id = 1;

    deletefrom dep where id = 3;

    结果如下:

    617f004ada9096ce5b924c0d9a5bfffa.png

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

    级联更新级联删除

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

    deletefrom emp where id = 4;

    deletefrom dep where id = 3;#因为不影响关联的字段,所以会报错,但比较麻烦

    我们应该让这两关联的表在一张表进行修改时,另一张也跟着它修改,于是引入了级联删除级联更新的概念。

    #创建表#创建被关联表

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

    fc287f33eea62692c2220c89a9eedb60.png

    建立级联更新和级联删除后,可以进行表修改操作并让两边同步。

    多对多

    """图书与作者表

    一定要换位思考

    先站在图书

    多本书能否有一个作者

    一个作者能否写多本书 可以!!!

    再站在作者

    多个作者能否和写一本书

    一本书能否有多个作者 可以!!!

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

    强调 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('python从入门到入土',199),('程序员的自我修养之脊椎康复指南',299),('MySQL之删别人的库让别人跑路',25);

    insert into author(name,age) values('jason',18),('tank',38);

    insert into book2_author(book_id,author_id) values(4,3); #报错

    insert into book_author(book_id,author_id) values(1,1),(1,2),(2,1),(3,1),(3,2);

    b2aeee93f767dd2ff773c66e8907c527.png

    一对一

    客户表和学生表(学校的客户与学生之间,报名之前都是客户,只有报了名的才能是学生)

    #左表的一条记录唯一对应右表的一条记录,反之也一样

    create table customer(

    id int primary key auto_increment,

    name char(20) notnull,

    qq char(10) notnull,

    phone char(16) notnull

    );

    create table student(

    id int primary key auto_increment,

    class_name char(20) notnull,

    customer_id int unique,#该字段一定要是唯一的

    foreign key(customer_id) references customer(id) #外键的字段一定要保证unique

    on delete cascade

    on update cascade

    );#三种外键关系都是用foreign key,区别在于如何使用以及其他条件限制即可做出三种关系

    5cb5497a9333d45d28f857fafea5d42c.png

    594608fb026dfda177b6583216c77fe6.png

    总结

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

    图书与出版社

    一本书可不可以有多个出版社 不可以!!!

    一个出版社可不可以出版多本书 可以!!!

    一对多的关系"""图书与作者表

    一本书可不可以有多个作者 可以!!!

    一个作者可不可以写多本书 可以!!!

    多对多的关系"""作者与作者详情

    一个作者可不可以有多个详情 不可以!!!

    一个作者详情可不可以有多个作者 不可以!!!

    要么两者是一对一

    要么两者之间没任何关系"""

    修改表

    #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 * fromservice;#只复制表结构

    select * from service where 1=2; //条件为假,查不到任何记录

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

    create table t4 like employees;

    展开全文
  • Mysql表关系

    2021-02-03 04:41:54
    mysql表关系表关系关系型数据库特有的三种关系一对一关系一对多关系多对多关系总结一对一例子:用户和用户信息外键设置在用户上,外键字段唯一非空添加无级联:先增加被关联记录(用户信息),再增加关联...

    mysql多表关系

    多表关系是关系型数据库特有的

    三种关系

    一对一关系

    一对多关系

    多对多关系

    总结

    一对一

    例子:用户和用户信息

    外键设置在用户上,外键字段唯一非空

    添加

    无级联:先增加被关联表记录(用户信息表),再增加关联表记录(用户表)

    级联:相同

    删除

    无级联:先删除关联表记录,再删除被关联表记录

    级联:可以直接先删除被关联的记录,直接删除两张表

    修改

    无级联:关联与被关联表都无法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)

    级联:可以直接修改

    detail_id int unique not null,

    foreign key(detail_id) references author_detail(id)

    on update cascade

    on delete cascade

    一对多

    例子:购物车和商品

    外键必须放在多的一方(商品),此刻外键不唯一

    添加

    无级联:先增加被关联表记录(购物车),再增加关联表记录(商品)

    级联:相同

    删除

    无级联:先删除关联表记录,再删除被关联表记录

    级联:可以直接先删除被关联的记录,直接删除相关联的所有表

    修改

    无级联:关联与被关联表都无法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)

    级联:可以直接修改,并修改相关联的表

    author_id int,

    foreign key(author_id) references author(id)

    on update cascade

    on delete cascade

    多对多

    例子:学生和课程

    会创建一张第三方关系表,每一个外键值不唯一,可以看做是外键的联合唯一

    添加

    无级联:只要两方都有数据存在,就能添加,但是要注意,联合唯一

    级联:相同

    删除

    无级联:有关系的不能删除相关的表,但是能够删除关系表的记录

    级联:会删除中间表有关系的记录

    修改

    无级联:关联与被关联表都无法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)

    级联:可以直接修改,中间的联系表的内容

    id int primary key auto_increment,

    # 关系表一定有多个外键,关联着多张表

    # 关联学生表

    student_id int,

    foreign key(student_id) references student(id)

    on update cascade

    on delete cascade,

    # 关联课程表

    course_id int,

    foreign key(course_id) references course(id)

    on update cascade

    on delete cascade,

    # 建立两个字段的联合唯一

    unique(student_id, course_id)

    多表关系

    """

    一对一:丈夫-妻子,用户-身份证,作者-作者详情

    一对多:部门-员工,班级-学生,书-出版社

    多对多:老师-班级,课程-学生,出版社-作者

    """

    # 书 - 出版社 - 作者 - 作者详情 外键分布

    # 外键是 建立表与表关联 的字段,通常 一个表的外键 是 另一个表的主键(唯一键也可以)

    # 一对一:外键在任何一方都可以,此时外键要设置 唯一键

    """

    作者(author):id,name,sex,age,mobile

    作者详情(author_detail): id,info,address,author_id

    ----------------------------------------------------

    作者(author):id,name,sex,age,mobile, detail_id

    1 Tom 1

    2 Bom 2

    3 Bob 3

    作者详情(author_detail): id,info,address

    1 Tom_info

    2 Bom_info

    """

    # 一对多:外键必须放在多的一方,此时外键值不唯一

    """

    书(book):id,name,price,publish_id

    1 西游记 1

    2 东游记 2

    3 西厢记 1

    4 流浪记 1

    出版社(publish): id,name,address,phone

    1 老奶奶出版社

    2 小奶奶出版社

    """

    # 多对多:一定要创建第三张表(关系表),每一个外键值不唯一,看可以多个外键建立联合唯一

    """

    作者(author):id, name, age

    出版社(publish):id, name, address

    作者与出版社关系表:id, author_id, publish_id

    idauthor_idpublish_id

    111

    212

    321

    422

    """

    外键

    # 作者(author):id,name,sex,age,mobile, detail_id

    # 作者详情(author_detail): id,info,address

    # 1、外键的 字段名 可以自定义(名字随意),通常命名规范(关联表_关联字段)

    # 2、外键要通过 foreign key 语法建立表与表之间的关联

    # 3、foreign key(所在表的外键字段) references 关联表(关联字段)

    # eg:foreign key(detail_id) references author_detail(id)

    # 4、级联关系

    #级联更新 on update cascade

    # 级联删除 on delete cascade

    # 重点:外键字段本身可以唯一或不唯一,但是外键关联的字段一定唯一

    一对一:无级联关系

    # 作者详情(author_detail): id,info,address

    create table author_detail(

    id int primary key auto_increment,

    info varchar(256),

    address varchar(256)

    );

    # 作者表id,name,sex,age,mobile, detail_id

    create table author(

    id int primary key auto_increment,

    name varchar(64) not null,

    mobile char(11) unique not null,

    sex enum('男', '女') default '男',

    age int default 0,

    detail_id int unique not null,

    foreign key(detail_id) references author_detail(id)

    );

    # 必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据

    mysql>: insert into author_detail(info,address) values('Tom_info','Tom_address');

    mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1);

    mysql>: insert into author_detail(info,address) values('Bob_info','Bob_address');

    mysql>: insert into author(name,mobile,detail_id) values('Bob','15666882233', 2);

    # 修改关联表 author

    mysql>: insert into author_detail(info,address) values('Tom_info_sup','Tom_address_sup');

    mysql>: update author set detail_id=3 where detail_id=2; # 有未被其他数据关联的数据,就可以修改

    # 删除关联表 author

    mysql>: delete from author where detail_id=3; # 直接删除

    # 修改被关联表 author_detail

    mysql>: update author_detail set id=10 where id=1; # 无法修改

    # 删除被关联表 author_detail

    mysql>: delete from author_detail where id=1; # 无法删除

    # 没有级联关系下:

    # 增加:先增加被关联表记录,再增加关联表记录

    # 删除:先删除关联表记录,再删除被关联表记录

    # 更新:关联与被关联表都无法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)

    一对一:有级联关系

    mysql>: drop table author;

    mysql>: drop table author_detail;

    # 作者详情(author_detail): id,info,address

    create table author_detail(

    id int primary key auto_increment,

    info varchar(256),

    address varchar(256)

    );

    # 作者表id,name,sex,age,mobile, detail_id

    create table author(

    id int primary key auto_increment,

    name varchar(64) not null,

    mobile char(11) unique not null,

    sex enum('男', '女') default '男',

    age int default 0,

    detail_id int unique not null,

    foreign key(detail_id) references author_detail(id)

    on update cascade

    on delete cascade

    );

    # 必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据

    mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1); # 错误

    mysql>: insert into author_detail(info,address) values('Tom_info','Tom_address');

    mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1);

    mysql>: insert into author_detail(info,address) values('Bob_info','Bob_address');

    mysql>: insert into author(name,mobile,detail_id) values('Bob','15666882233', 2);

    # 修改关联表 author

    mysql>: update author set detail_id=3 where detail_id=2; # 失败,3详情不存在

    mysql>: update author set detail_id=1 where detail_id=2; # 失败,1详情已被关联

    mysql>: insert into author_detail(info,address) values('Tom_info_sup','Tom_address_sup');

    mysql>: update author set detail_id=3 where detail_id=2; # 有未被其他数据关联的数据,就可以修改

    # 删除关联表 author

    mysql>: delete from author where detail_id=3; # 直接删除

    # 修改被关联表 author_detail

    mysql>: update author_detail set id=10 where id=1; # 级联修改,同步关系关联表外键

    # 删除被关联表 author_detail

    mysql>: delete from author where detail_id=10; # 可以删除对被关联表无影响

    mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 10);

    mysql>: delete from author_detail where id=10; # 可以删除,将关联表的记录级联删除掉

    一对多

    # 一对多:外键必须放在多的一方,此时外键值不唯一

    # 出版社(publish): id,name,address,phone

    create table publish(

    id int primary key auto_increment,

    name varchar(64),

    address varchar(256),

    phone char(20)

    );

    # 书(book):id,name,price,publish_id, author_id

    create table book(

    id int primary key auto_increment,

    name varchar(64) not null,

    price decimal(5, 2) default 0,

    publish_id int, # 一对多的外键不能设置唯一

    foreign key(publish_id) references publish(id)

    on update cascade

    on delete cascade

    );

    # 增:先增加被关联表(publish)的数据,再增加关联表(book)的数据

    mysql>: insert into publish(name, address, phone) values

    ('人民出版社', '北京', '010-110'),

    ('西交大出版社', '西安', '010-119'),

    ('老男孩出版社', '上海', '010-120');

    mysql>: insert into book(name, price, publish_id) values

    ('西游记', 6.66, 1),

    ('东游记', 8.66, 1),

    ('python从入门到入土', 2.66, 2),

    ('轮程序员修养之道', 3.66, 3),

    ('好好活着', 88.88, 3);

    # 没有被关联的字段,插入依旧错误

    mysql>: insert into book(name, price, publish_id) values ('打脸之道', 0.3, 4); # 失败

    # 更新:直接更新被关联表的(publish) 主键,关联表(book) 外键 会级联更新

    mysql>: update publish set id=10 where id=1;

    # 更新:直接更新关联表的(book) 外键,修改的值对应被关联表(publish) 主键 如果存在,可以更新成功,反之失败

    mysql>: update book set publish_id=2 where id=4; # 成功

    mysql>: update book set publish_id=1 where id=4; # 失败

    # 删:

    #删被关联表,关联表会被级联删除

    mysql>: delete from publish where id = 2;

    #删关联表,被关联表不会发生变化

    mysql>: delete from book where publish_id = 3;

    # 假设:书与作者也是 一对多 关系,一个作者可以出版多本书

    create table book(

    id int primary key auto_increment,

    name varchar(64) not null,

    price decimal(5, 2) default 0,

    publish_id int, # 一对多的外键不能设置唯一

    foreign key(publish_id) references publish(id)

    on update cascade

    on delete cascade

    # 建立与作者 一对多 的外键关联

    author_id int,

    foreign key(author_id) references author(id)

    on update cascade

    on delete cascade

    );

    多对多

    # 多对多:一定要创建第三张表(关系表),每一个外键值不唯一,看可以多个外键建立联合唯一

    mysql>: drop table author;

    mysql>: drop table author_detail;

    mysql>: drop table book;

    mysql>: drop table publish;

    # 作者(author):id, name, age

    create table author(

    id int primary key auto_increment,

    name varchar(64),

    age int unsigned default 0

    );

    # 出版社(publish):id, name, address

    create table publish(

    id int primary key auto_increment,

    name varchar(64),

    address varchar(256)

    );

    # 作者与出版社关系表:id, author_id, publish_id

    create table author_publish(

    id int primary key auto_increment,

    # 关系表一定有多个外键,关联着多张表

    # 关联作者表

    author_id int,

    foreign key(author_id) references author(id)

    on update cascade

    on delete cascade,

    # 关联出版社表

    publish_id int,

    foreign key(publish_id) references publish(id)

    on update cascade

    on delete cascade,

    # 建立两个字段的联合唯一

    unique(author_id, publish_id)

    );

    # 注:关系表 关联着 作者 和 出版社 两张表,在表结构上 作者 与 出版社 两表键没有任何关系

    # 增:两张被关联表,没有前后关系,但关系表必须在两个表都提供数据后才能进行 关系匹配

    mysql>: insert into author(name, age) values('ruakei', 67),('engo', 76),('Lxx', 3);

    mysql>: insert into publish(name, address) values('老男孩出版社', '上海'),('小女孩出版社', '北京');

    # 操作关系表:

    mysql>: insert into author_publish(author_id, publish_id) values(1,1),(1,2),(2,1),(2,2),(3,1);

    # 关系表操作:增、删、改,只要两张被关系表有提供对应的操作数据,都可以操作成功,且对两张被关系表没有影响

    # 操作两张被关系表:

    #增:不会影响关系表

    mysql>: insert into publish(name, address) values('西交大出版社', '西安');

    #改:关系表都会级联更新

    mysql>: update publish set id=10 where id=1;

    #删:关系表都会级联删除

    mysql>: delete from author where name='ruakei';

    展开全文
  • mysql数据表建立主外键需要注意以下几点:需要建立主外键关系的两个的存储引擎必须是InnoDB。外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型。外键列和参照列必须创建索引,如果外键列不存在...
  • 1.表关系分类:总体可以分为三类: 一对一 、一对多(多对一) 、多对多2.如何区分之间是什么关系?#分析步骤:#多对一/一对多#1.站在左的角度去看右(情况一)如果左中的一条记录,对应右中多条记录.那么他们...
  • Mysql 之间的关系

    千次阅读 2021-01-28 06:55:02
    一、前言研究之间的关系前,先要知道将所有数据存放在一张中的弊端:1.结构不清晰 ---> 不致命2.浪费空间 ---> 不致命3....需要给两张之间,建立一种强有力的关系, 使用 “外键”。...
  • E-R 图 (实体关系模型)E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。它是描述现实世界关系概念模型的有效方法。是表示概念关系模型的一...
  • 每次安装MySQL Community ...比如说你的某个数据库中,创建了一个十多个,现在你想看看他们之间的关系图,比如的主外键关系,就可以利用此功能实现。具体步骤如下:打开一个连接,其实就是连去mysql server...
  • 下面简单介绍一下如何使用mysql workbench建立数据库,建立新的,为添加数据。点击上图中的“加号”图标,新建一个连接,如上图,先输入数据库的账号密码,帐号默认为root,填好密码后 点击“ok”,连接就建立好...
  • mysql表建立连接的实现方法发布时间:2020-04-15 10:33:14来源:亿速云阅读:162作者:小新关系型数据库为了减少数据占用有限的存储空间,都会进行数据分割到几个的规范化处理,将这几个分割管理的数据重新结合到...
  • 扩展性极差2、寻找之间的关系的套路举例:emp dep步骤一:part1:1、先站在左emp的角度2、去找左emp的多条记录能否对应右dep的一条记录3、翻译2的意义:左emp的多条记录==》多个员工右dep的一条...
  • [数据库]MySQL创建数据建立主外键关系0 2018-07-04 01:01:25为mysql数据表建立主外键需要注意以下几点:需要建立主外键关系的两个的存储引擎必须是InnoDB。外键列和参照列必须具有相似的数据类型,即可以隐式...
  • **构建两张表的多对多...打开navicat,创建三张表,clean_data表与user表,以及两个表之间的关系表(clean_data_user表)。表结构分别如下:图1 clean_data设计表图2 user设计表图3 clean_data_user设计表2.建立外键...
  • 前言为mysql数据表建立主外键需要注意以下几点:需要建立主外键关系的两个的存储引擎必须是InnoDB。外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型。外键列和参照列必须创建索引,如果外键列不...
  • 下面将介绍mysql如何让表建立连接。1.内连接内连接就是间的主键和外键相连,只取得键值一致的数据的连接方式。具体语法:Select 列名1…from 1 inner join 2 on 1.外键=2.主键 [where /order by 语句]举个...
  • 在数据库中,如果两个的之间的关系为,多对多的关系,如:“学生和课程”,一个学生的可以选多门课,一门课也可以被多门学习选;根据数据库的设计原则,应当形成第三张关联步骤1:创建三张数据Student ,...
  • Django 操作-之间的关系(建立MySQL上)数据之间的关系有:一对多,多对多和一对一,在Django项目中做好建立表关系的准备数据:book,book_detail,author,publish数据关系:多对多:book和author一对多:...
  • 在课堂上,我们都是“学习”数据库...我已经设法创建数据库和,但现在我如何在两个之间建立关系?如果我有我的两个这样:CREATE TABLE accounts(account_id INT NOT NULL AUTO_INCREMENT,customer_id INT( 4 )...
  • 表与表之间的关系表1 foreign key 表2则表1的多条记录对应表2的一条记录,即多对一利用foreign key的原理我们可以制作两张表的多对多,一对一关系多对多:表1的多条记录可以对应表2的一条记录表2的多条记录也可以...
  • 生成数据库表关系

    千次阅读 2021-01-27 23:03:43
    "云数据库RDS MySQL版","des":"云数据库RDS MySQLMySQL 是全球最受欢迎的开源数据库,阿里云MySQL版 通过深度的内核优化和独享实例提供稳定极致的数据库性能,同时灵活的部署架构及产品形态,可满足不同场景下的...
  • 如下,有四张表:游戏类型表,游戏表,点卡和游戏关系表,点卡表CREATE TABLE `gamesType`(`tId` INT AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT'游戏类型编号',`tName` VARCHAR(10) NOT NULL COMMENT'游戏类型...
  • What I’ve thought about here is using the ID from the junction table ‘pricelist_products’ as a foreign key within the prices table, but this feels ...联结的目的是在多对多关系中唯一定义每个组合(最...
  • mysql数据库关系操作

    2021-01-19 22:24:13
    ### mysql数据库#### 知识要点:1. 数据操作增、删、改2. 外键约束要求3. 一对多表关系4. 一对一表关系5. 多对多表关系6. 外键约束的参照操作### 数据操作#### 插入数据方法一:```sqlINSERT [INTO] table_name [...
  • mysql数据设计-班级 学生 老师 课程 成绩image.png/*Navicat Premium Data TransferSource Server : localhostSource Server Type : MySQLSource Server Version : 50624Source Host : localhostSource....
  • $query = mysql_query("select page_id,page_text from pagecontents where img_exist > 0") or die(mysql_error() ); while($rows = mysql_fetch_array($query)) { $pid = $rows['page_id']; $ptext = $rows['page...
  • 之前简单写了一下 MySQL 最基本的 增、删、改、查,这里继续来写 MySQL 建立数据和数据类型说明。建立数据虽然看似简单,但其中还是涉及到很多内容的,例如 数据类型、主键 等。如果要看 MySQL 最基本的 增、删...
  • 数据库-表关系

    千次阅读 2021-01-28 03:25:12
    之间的关系多对一,多对多,一对一2.复制分表:为什么要分表?一个中 要存储个人信息又要存储部门信息 会导致大量的数据冗余所有数据存放在同一个中 将导致以下几个问题1.浪费空间 不致命2.结构混乱3.修改...
  • 外键 现在有两张“分类”和“商品”,为了表明商品属于哪个类别,通常情况下,我们...通过主和从的外键描述主外键的关系,呈现的就是一对多的关系。外键特点1.从外键的值是对主键的引用。2.从外键类型...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 189,932
精华内容 75,972
关键字:

mysql怎么建立表的关系

mysql 订阅