精华内容
下载资源
问答
  • 之间建立关系

    2021-03-02 19:04:26
     建立表关系的原因?: 2、 针对数据量大的情况下讨论  1:表的结构不清晰(一张表中涵盖多种数据)  2:浪费硬盘空间(有重复的数据)  3:表的扩展性极差(不便于增加,修改,删除等操作) 二、表与表的关系:...

    一、表的概念与分类

    主要通过外键关键字:pirmary key 来建立连系
    1、表与表之间的关系可以分为三种:一对多,多对多,一对一的关系
      建立表关系的原因?:
    2、 针对数据量大的情况下讨论
      1:表的结构不清晰(一张表中涵盖多种数据)
      2:浪费硬盘空间(有重复的数据)
      3:表的扩展性极差(不便于增加,修改,删除等操作)

    二、表与表的关系:一对多

    例如:一个公司的员工和部门之间的连系,把员工和部门分别抽离出来分析
      (1)先站在员工表看能否有多个员工对应一个部门>>>一个部门能否有多个员工(可以)
      (2)再站在部门表看能否有多个部门对应一个员工>>>一个员工能否属于多个部门(不可以)

    结论:员工表和部门表之间的关系是“一对多”的关系(一对多或者多对一)
    在这里插入图片描述
    根据id索引来寻找匹配的内容先通过列表的形式,把一张完整的表切分出来,分析它们之间的关系多对一还是多对多就可以看出情况,换位思考!

    foreign key:外键约束
      1、创建表的时候,必须先创建被关联的表
      2、插入数据的时候,也必须先插入被关联表的数据(先后顺序不能颠倒,不然会报错!)
    代码如下:
      建表:

    # 先建被关联的表
    
    create table dep(
        id int primary key auto_increment,
        dep_name varcher(32),
        dep_desc varcher(128)
    
    );
    
    # 后建数据多的表
    create table emp(
    id int primary key auto_increment,
    emp_naem varchar(64),
    emp_gender enum('male','female','others') default 'male',
    dep_id int,
    foreidn key(dep_id) references dep(id)
    
    );
    

    插入数据:

    insert into dep(dep_name,dep_desc) values('外交部','搞外交'),
            ('教学部','教书育人'),
            ('技术部','技术能力有限部门')
            ;
    
    insert into emp(emp_name,dep_id) values('jack',1),
         ('reso',2),
         ('gelen','3'),
         ('james',2);
    

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210302190842410.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUyNTEyOTM4,size_16,color_FFFFFF,t_70
    在这里插入图片描述
    在这里插入图片描述
    2、修改表数据
      通过主键和对应的关系可以对表中的记录增加,修改,删除等操作,也是有先后顺序的

    update dep set id=200 where id=1; # 修改id
    update emp set dep_id =300 where id=1;
    
    delect from dep where id=3; # 删除id3的数据记录
    

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

    1.删除数据的时候  先删员工表的数据 再删部门表的数据
        delete from emp where id = 4;
        delete from dep where id = 3;
    2.级联更新级联删除
    

    3、级联更新、级联删除

    create table dep(
    id int primary key auto_increment,
    dep_name varchar(32),
    dep_desc varchar(128)
    
    );
     
    caeate table emp(
    id int primary key auto_increment,
    emp_name carchar(64),
    emp-gender enum('male','female','othres') default 'male',
    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('jack',2),('rose',1),('kevin',3),('galen',1);
    
    # 修改 删除数据
    update dep set id=200 where id=3;
    delect from dep where id=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 varcher(32),
    age int
    
    );
    # 手动创建第三方表
    create table book2author(
        id int primary key auto_increment,
        book_id int,
        foreign key(book_id) references book(id)
        on uptade cascade
        on delete cascade , # 直接建立级联
    
        author_id int,
        foregn key (author_id) refrrences  author(id)
        on update cascade
        om delete cascade  #
     
    );
    

    插入数据:

    insert into book(title,price) values('百年孤独'60),(‘丰乳肥臀’,90),(‘疯狂说英语’,129);
    
    insert into auther (nane,age) values('西亚·马尔克斯'98),(‘莫言’,87),(‘李阳’,53);
    
    
    insert into book2auther(book_id,age) values(1,2),(2,3),(2,1),(1,3);
    

    在这里插入图片描述
    **

    四、一对一关系

    **
      1:一对一的场景,当数据量过大的时候,可以考虑把表给拆分开

    2:如老男孩的客户和学生关系(没交学费前和交学费后)

    3:姓名、电话,地址
      在这里插入图片描述
    一对一的关系:外键字段都可以建在任意一方,一般建议把外键字段建立在查找频繁的那一方

    创建表:

    # 左表的一条记录唯一对应右表的一条记录,反之也一样
    
    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.修改表的完整语句
                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;
    
    展开全文
  • 数据库(三) 表建立联系-外键

    千次阅读 2021-02-06 11:48:42
    1.理解表与表之间建立...扩展性差针对这个问题我们可以将他们分成两张表,一张专门记录个人信息,一张专门记录部门和部门工作建立表的时候我们需要进行分析1.站在个人信息表的角度:一个老师能否属于多个部门,不能!!...

    1.理解表与表之间建立关系的必要性

    比如我们建立了一张个人信息表,把所有人的信息都存在这张表中

    f6211d2dad946d1470b2b9fdbf7e8bb4.png

    这张表中有老师和他们所属的部门,并且不同的部门工作也是不同的

    所有数据存放在一张表中的弊端

    1.组织结构不清晰

    2.浪费存储空间

    3.扩展性差

    针对这个问题我们可以将他们分成两张表,一张专门记录个人信息,一张专门记录部门和部门工作

    建立表的时候我们需要进行分析

    1.站在个人信息表的角度:一个老师能否属于多个部门,不能!!!

    2.站在部门表的角度:一个部门能否有多个老师,可以!!!

    那这两张表的关系就是老师表多对一部门表,也可以这么说,部门表一对多老师表

    在表中是如何表示这种关系,需要找出一个两者中独一无二的东西并且把他们连接起来,我们在部门表中创建一个部门的id,在老师表中添加这个属性并指向部门id

    如下表所示

    26852d2a6109b87bc4adea41999d3b60.png

    这样我们就可以把两者联系起来了,但是老师的dep_id我们还是可以随意的修改,应该有一个限制,限制他们只能和部门表的id相同才对

    2.外键(foreign key)

    什么是外键

    如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。

    外键的作用

    保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。外键拥有能使两张表阻止执行和级联执行的特点

    所以要把两张有关联的表联系起来需要用到外键(foreign key)

    阻止执行

    从表插入新行,其外键值不是主表的主键值便阻止插入;

    从表修改外键值,新值不是主表的主键值便阻止修改;

    主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表 的相关行);

    主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。

    级联执行

    主表删除行,连带从表的相关行一起删除;

    主表修改主键值,连带从表相关行的外键值一起修改。两种方法提供给用户选择。无论选取哪种方法,从表里都不会有多余行。从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现与主表中的标志一致。

    3.表与表关系之一对多

    还是使用上面老师表和部门表的例子,两者是一对多的关系

    e52e115a9b38ba035c18df40a7389f7c.png

    1.在创建表的时候,我们需要先建被关联的表dep,才能建关联表teacher

    #先创建部门表dep

    create table dep(

    id int primary key auto)increment,

    dep_name char(16),

    duty varchar(16)

    );#再创建老师表teacher

    create table teacher(

    id int primary key auto_increment,

    gender enum('male','female') not null default 'male',

    dep_id int,

    foreign key(dep_id) references dep(id)

    );

    2.在插入记录时,必须先插被关联的表dep,才能插关联表teacher

    #先插入被关联表的记录

    insert dep(dep_name,duty) values

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

    ('德育部','培养品德'),

    ('体育部','强身健体');#再插入关联表的记录

    insert teacher(name,dep_id) values

    ('sxc',1),

    ('zzp',2),

    ('zzj',3),

    ('lzx',1),

    ('yzy',1);

    0d0146ad39f4e42654a7024dc8f63c29.png

    在我们创建完成之后,发现修改或者删除teacher表中的dep_id或者dep表中的id都无法成功,删除dep表中的数据也无法成功

    44f0b0221d3510af76ec4305aece4afa.png

    这是因为dep表中的数据还跟teacher表中的数据相关联,我们想要操作数据,比如:需要先删除教学部对应所有的员工,再删除教学部

    这样操作数据变得非常的复杂,能否有一种简单的方式,不需要考虑关联表的情况,比如我删除一个部门,那么这个部门的所有员工都跟着被删除

    3.修改和删除都需要考虑关联关系>>>同步更新和同步删除

    #把原表删除后新建两张表#还是需要先建被关联表dep

    create table dep(

    id int primary key auto_increment,

    dep_name char(10),

    duty char(10)

    );#再创建关联表teacher

    create table teacher(

    id int primary key auto_increment,name char(10),

    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 dep(dep_name,duty) values

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

    ('德育部','培养品德'),

    ('体育部','强身健体');#再插入关联表的记录

    insert teacher(name,dep_id) values

    ('sxc',1),

    ('zzp',2),

    ('zzj',3),

    ('lzx',1),

    ('yzy',1);

    这样我们删除一个部门之后这个部门所有的人都会跟着被删除

    更新部门后,对应老师表中的部门字段也会跟着改变

    1af8394ac467522cae9eb904e54ecd8f.png

    4.表与表关系之多对多

    我们建立一个图书表和作者表,思考两者的关系

    96ea7e40fd666f158082c35e1fed85f7.png

    站在两张表的角度进行分析

    1.站在图书表:一本书可不可以有多个作者,可以!!!

    2.站在作者表:一个作者可不可以写多本书,可以!!!

    那他们两者对于对方都是多对一的关系,那我们称这种关系为多对多

    在创建一对多关联表时,必须得先创建被关联表(没有外键的),才能创建关联表(有外键的),在多对多关联表中,两者就都需要使用外键关联,这样先创建谁都不合适

    我们必须创建第三张表,并且该表需要拥有两个字段分别代表这两个表中的id

    #因为需要创建第三张表关联两张表,所以两张表没有创建的先后顺序

    create table book(

    id int primary key auto_increment,

    name char(16),

    price int

    );

    create table author(

    id int primary key auto_increment,

    name char(10)

    );#为两张表插入数据

    insert book(name,price) values

    ('book1',100),

    ('book2',466),

    ('book3',55),

    ('book4',211);

    insert author(name) values

    ('sxc'),

    ('zzj'),

    ('zzp');#插入第三张表,将另两张表的id作为外键

    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

    );#为第三张表插入对应的记录

    insert author2book(author_id,book_id) values

    (1,1),

    (1,4),

    (2,1),

    (2,3),

    (3,2),

    (3,3);

    注意:两张关系表虽然有关联,但不是直接关联的,而是和第三张表关联,所以在删除表中数据的时候,另外一张表是没有影响的,只有第三张我们自己定义的表是级联更新,级联删除的

    dbe91c6848058786c24b33b1222ac2a7.png

    5.表与表关系之一对一

    我们建立一个学生表和信息表,思考两者的关系

    c72f30f4ca9b5b35a7cb1965a63ce492.png

    还是站在两张表的角度进行分析

    1.一个学生可不可以有多个详细信息,不可以!!!

    2.一个详细信息能否属于多个学生,不可以!!!

    那么这两者互相都不是多对一的关系,这有两种情况

    1.这两者没有关联

    2.两者是一对一的关系

    在创建一对一的关联表时,添加的外键可以放在两者任意一张表中,但是我们一般都放在比较常用的那一方

    #先创建没有外键的表

    create table stu_info(

    id int primary key auto_increment,

    stu_id int unique,

    phone int

    );#再创建另一个表

    create table student(

    id int primary key auto_increment,

    name varchar(16),

    age int,

    stu_info_id int unique,

    foreign key(stu_info_id) references stu_info(id)

    on update cascade

    on delete cascade

    );

    注意:创建外键时,一定要表明该键是唯一的,即unique,这样才能表示一对一的关系

    #先在无外键的表中插入记录

    insert stu_info(stu_id,phone) values

    (101,110),

    (102,120),

    (103,130);#然后在有外键的表中插入记录

    insert student(name,age,stu_info_id) values

    ('jason',18,1),

    ('egon',26,2),

    ('tank',24,3);

    c0d7ce926b6655178f9ae7c1f6be7e68.png

    d4bb0082bfb8cb5fa0da9761da33cc68.png

    5.如何找出两表之间的关系

    分析步骤:#1、先站在左表的角度去找

    是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id)#2、再站在右表的角度去找

    是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)#3、总结:#多对一:

    如果只有步骤1成立,则是左表多对一右表

    如果只有步骤2成立,则是右表多对一左表#多对多

    如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系#一对一:

    如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可

    6.修改表

    #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 旧字段名 新字段名 新数据类型 [完整性约束条件…];

    7.复制表

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

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

    36

    展开全文
  • 数据库-表关系

    千次阅读 2021-01-28 03:25:12
    之间的关系多对一,,一对一2.复制分表:为什么要分表?一个表中 要存储个人信息又要存储部门信息 会导致大量的数据冗余所有数据存放在同一个表中 将导致以下几问题1.浪费空间 不致命2.结构混乱3.修改...

    上节回顾:

    1.建表语法:

    注意点:

    2.数据类型:

    今日内容

    1.表之间的关系

    多对一,多对多,一对一

    2.复制表

    分表:

    为什么要分表?

    一个表中 要存储个人信息又要存储部门信息 会导致大量的数据冗余

    f31574e55c84c170ce64128d04d0f139.png

    所有数据存放在同一个表中 将导致以下几个问题

    1.浪费空间 不致命

    2.结构混乱

    3.修改数据时 如果有一百个员工 那就要该一百次 扩展性极差

    通过分表来解决

    c298959b7a8bf963964f8d9c65b6a4b4.png

    分表又造成新的问题 如何再将数据对应起来?

    为什么需要对应起来是因为两张表的数据具备这某种关系

    到底是什么关系呢?

    多对一的关系

    分析关联关系

    如何确定表之间的关系 需要从实际需求中分析

    第一步:

    从员工的角度来考虑

    多个员工是不是可以属于同一个部门?

    员工的多条记录是否对应部门的一条记录?

    如果是 则可以确定 员工与部门是多对一

    第二步:

    从部门的角度来考虑

    多个部门是不是可以有同一个员工?

    员工部门多条记录是否对应员工的一条记录?

    都不是 而是一个部门对应多个员工

    也就是 部门与员工之间是一对多

    最终我们发现 多个员工对应一个部门 一个部门对应多个员工

    称之为单向多对一

    如何在数据库中表示这种关系?

    我们可以员工表中保存部门表的编号

    614ca67e29e1b81ea6ed4f412c88334f.png

    外键约束

    问题:此时 我们的表之间存在关联但是是逻辑上的关联 并没有物理上的关联

    换句话说 员工中可以插入不存在的部门编号

    如何使其具备物理关联(硬性的关联)?

    方案:

    使用外键 foreign key

    语法:

    #创建表时:

    create table dept(id,xxxxx);

    create table emp(id,xxxxx,dept_id,foreign key(dept_id) references dept(id));

    #后期修改:

    alter table student add foreign key (id) references customer(id);

    主从表关系

    注意要建立外键关联,必须先创建主表

    先有部门 后又员工 员工属于部门 部门拥有员工 所以 主表是部门 从表是员工

    约束作用:

    此时我们在执行添加 更新 删除时都会受到外键的约束

    比如

    1.员工表中添加一个不存在的部门id

    2.修改某个部门的id

    3.删除某个部门的数据

    以上三种操作都会报错

    1.必须已经存在的部门id才能出现在员工表中

    2.无法修改 除非把员工全删掉

    3.需要先删除员工 才能删除部门

    处理起来都非常麻烦

    能不能让主表和从表之间的更删除同步进行?

    如果你是mysql开发者 你应不应该提供这样的功能?

    必须的 这就是级联操作

    级联操作

    有两种

    1.级联更新

    指的是主表更新时 从表同步更新

    2.级联删除

    指的是主表删除时 从表同步删除

    语法:

    create table emp(id,xxxxx,dept_id)foreign key(dept_id) references dept(id) on update cascade on delete cascade;

    验证级联操作

    多对多

    实例分析 什么情况下会出现多对多的关系

    学生表和老师表

    74b91f7f47a293b4a468970619df3864.png

    多对多的关系本质上是什么?

    是双向的多对一

    如何在数据库中表示这种关系?

    使用外键是不行的,需要创建第三张表专门用于存储关系

    这个第三张表 如何体现关系?

    在其中存储学生和老师的id即可 并且将它们作为外键关联到学生和老师表

    create table t_s_relation(id int primary key auto_increment,t_id int,s_id int,foreign key(t_id) references teacher(t_id),foreign key(s_id) references stu(s_id));

    为了去除重复的关系数据 可以给关系表添加主键约束 联合两个外键

    一对一

    实例分析:

    客户表 与 学生表

    一个客户对应一个学生 或没有成为学生

    一个学生 必然只对应一个客户

    60d5a877e01e4e54884fec6f136937b6.png

    如何表示这种对应关系 ?

    使用外键

    那么外键应该加到哪张表中呢?

    因为是先有客户才有学生 所以 客户是主表 学生是从表 应该加在学生表中

    我们已经知道一个学生只对应一个客户 ,但是有可能你写的时候写错了,写了一个重复的客户id

    此时将会造成数据错乱 如何解决呢?

    给外键字段再加上 唯一性约束

    三.复制表

    create table table_copy select *from t1;

    复制数据和表结构,但不会复制key

    只想要copy表结构怎么弄?

    create table table_copy select *from t1 where 0 = 1;

    给一个不成立的条件这样的话就查不到任何数据 ,只能复制表结构

    蠕虫复制

    insert into tablename(name) select name from tablename;

    如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

    展开全文
  • 不论是生活中,还是抽象出来的软件中,描述生活中的多个类型之间的关系,总结如下: 一对一关系 一对多关系、多对一关系 多对多关系 2、多关联关系的实现 可以通过添加外键来实现。 2.1 一对一 主键共享 两张...

    1、多表关联关系的分类

    既然数据库是存储项目中的数据的,项目中的数据主要是类型创建的对象,项目中类型和类型之间是有关系的,数据库中怎么体现出来?
    不论是生活中,还是抽象出来的软件中,描述生活中的多个类型之间的关系,总结如下:

    • 一对一关系
    • 一对多关系、多对一关系
    • 多对多关系

    2、多表关联关系的实现

    可以通过添加外键来实现。

    2.1 一对一
    • 主键共享
      两张表的主键,建立外键约束。
    -- 建立一对一关系:一夫一妻
    mysql> create table husband(
        -> hid int primary key auto_increment comment '丈夫编号',
        -> hname varchar(20) not null comment '丈夫姓名'
        -> );
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> create table wife(
        -> wid int primary key auto_increment comment '妻子编号',
        -> wname varchar(20) not null comment '妻子姓名'
        -> ,foreign key(wid) references husband(hid)
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    -- 测试数据
    mysql> insert into husband(hname) values('邓超');
    Query OK, 1 row affected (0.01 sec)
    mysql> insert into husband(hname) values('张若昀');
    Query OK, 1 row affected (0.01 sec)
    mysql> insert into wife(wname) values('孙俪');
    Query OK, 1 row affected (0.01 sec)
    mysql> insert into wife(wname) values('唐艺昕');
    Query OK, 1 row affected (0.00 sec)
    mysql> insert into wife(wname) values('孙怡');
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`power`.`wife`, CONSTRAINT `wife_ibfk_1` FOREIGN KEY (`wid`) REFERENCES `husband` (`hid`))
    
    • 外键唯一
      子表添加一个新的字段并给该字段添加唯一约束和外键约束,然后关联父表主键字段。
    -- 建立一对一关系:一夫一妻
    mysql> create table wife(
        -> wid int primary key auto_increment comment '妻子编号',
        -> wname varchar(20) not null comment '妻子姓名',
        -> w_hid int unique, 
        -> foreign key (w_hid) references husband(hid));
    Query OK, 0 rows affected (0.03 sec)
    -- 测试数据:可以不按顺序插入,只要丈夫编号对应即可
    mysql> insert into wife(wname,w_hid) values('唐艺昕',2);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into wife(wname,w_hid) values('孙俪',1);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from wife;
    +-----+--------+-------+
    | wid | wname  | w_hid |
    +-----+--------+-------+
    |   1 | 唐艺昕 |     2 |
    |   2 | 孙俪   |     1 |
    +-----+--------+-------+
    2 rows in set (0.00 sec)
    
    2.2 一对多
    • 外键添加在多的一方,关联一的主键。
    -- 建立一对多关系:一个学生有多门课程
    mysql> create table stu(
        -> id int primary key auto_increment,
        -> sname  varchar(20) not null);
    Query OK, 0 rows affected (0.02 sec)
    mysql> create table course(
        -> id int primary key auto_increment,
        -> cname varchar(50) not null,
        -> score int default 0,
        -> sid int,
        -> foreign key (sid) references stu(id)
        -> );
    Query OK, 0 rows affected (0.03 sec)
    -- 测试数据
    mysql> insert into stu (sname) values('zhangsan');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into course(cname,score,sid) values('math',98,1);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into course(cname,score,sid) values('chinese',99,1);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into course(cname,score,sid) values('english',111,1);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from course;
    +----+---------+-------+------+
    | id | cname   | score | sid  |
    +----+---------+-------+------+
    |  1 | math    |    98 |    1 |
    |  2 | chinese |    99 |    1 |
    |  3 | english |   111 |    1 |
    +----+---------+-------+------+
    3 rows in set (0.00 sec)
    
    2.3 多对多
    • 外键:两张表的普通字段,直接建立关联关系(不推荐)
    • 中间表:创建一个中间表,中间表的两个普通字段分别关联另两张表的主键。
    -- 建立多对多关系:一个学生有多个老师,一个老师有多个学生
    -- 我这里之前已经创建过学生表
    mysql> desc stu;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int         | NO   | PRI | NULL    | auto_increment |
    | sname | varchar(20) | NO   |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    2 rows in set (0.01 sec)
    
    mysql> create table teacher(
        -> tid int primary key auto_increment,
        -> tname varchar(10));
    Query OK, 0 rows affected (0.03 sec)
    
    -- 中间表
    mysql>  create table stu_tea(
        -> id int primary key auto_increment,
        -> sid int,
        -> tid int,
        -> foreign key(sid) references stu(sid),
        -> foreign key(tid) references teacher(tid));
    Query OK, 0 rows affected (0.02 sec)
    

    总结

    • 中小型项目中的数据表,为了避免垃圾数据的出现,强制添加外键约束
      项目规模和项目本身对于数据的安全性约束较少,容易产生垃圾数据
    • 大型项目并且对数据查询性能较高的数据表,约定的方式关联(不额外添加外键)
      项目规模和项目本身对于数据安全性约束较多,不容易产生垃圾数据
      不需要额外添加外键提高查询数据时的性能消耗
    展开全文
  • MySQL之多表操作

    千次阅读 2021-01-18 23:08:53
    前言:之前已经针对数据库的单查询进行了详细的介绍:MySQL之增删改查,然而实际开发中业务逻辑较为复杂,需要对张表进行操作,现在对多表操作进行介绍。前提:为方便后面的操作,我们首先创建一数据库 test,...
  • mysql表关系

    千次阅读 2021-01-19 23:33:19
    之间的关系"""把所有数据都存放于一张的弊端1.组织结构不清晰2.浪费硬盘空间3.扩展性极差"""#上述的弊端产生原因类似于把代码全部写在一py文件中,你应该怎么做?>>>解耦合!将上述一张拆成...
  • Navicat for MySQL怎么建立多表链接,字段,两,所示,关系,主键Navicat for MySQL怎么建立多表链接易采站长站,站长之家为您整理了Navicat for MySQL怎么建立多表链接的相关内容。构建两张多关系:清洗数据...
  • navicat怎么看表关系

    千次阅读 2021-01-25 20:03:45
    今天需要分析一数据库,然后想看看各个之间的关系,所以需要查看之间的关系图,专业术语叫做ER关系图。默认情况下,Navicat显示的界面是这样的:软件将当做一对象,然后显示了所有的。仅仅通过这些...
  • Sequelize多表联合查询案例

    千次阅读 2021-05-12 11:12:06
    现在有两个表,A和B,关联关系: MATCH中的job_history_id与JOB_HISTORY中的id相关联。 二、需求: 查询Match中的user_id,report_comment,以及job_history_id所关联的JOB中的job_link,在前端显示。 三、...
  • Mysql 之间的关系

    千次阅读 2021-01-28 06:55:02
    一、前言研究之间的关系前,先要知道将所有数据存放在一张中的弊端:1.结构不清晰 ---> 不致命2.浪费空间 ---> 不致命3....需要给两张之间,建立一种强有力的关系, 使用 “外键”。...
  • 1、一对一可以两实体设计在一数据库中l例如设计一夫妻,里面放丈夫和妻子2、一对可以建两张,将一这一方的主键作为那一方的外键,例如一学生可以加一字段指向班级(班级与学生一对关系)3、...
  • mysql删除多个表格数据库数据的方法:在两个之间建立级联删除关系,实现删除一个的数据时,同时删除另一个中相关的数据,语句为【delete t1,t2 from t1,t2 where 条件】。【相关学习推荐:mysql教程(视频)】...
  • 数据库怎么设计的数据

    千次阅读 2021-01-19 19:55:55
    数据库怎么设计的数据一、...比如老师和学生,建立个关系表id,老师id,学生id即可二、数据设计(一对)做一个项目,必然是少不了数据库设计的!在学习阶段,基本都是单。然而在实际开发...
  • 一、总结1、项目中小组和主题之间是的2、可以将常用信息和不常用信息分成两个表来优化数据库2、一对的话:在的里面建立一的字段,比如母亲(一)和孩子(),在孩子里面添加母亲id3、...
  • 关系型数据库之间可存在的联系/关系(relationship)有三种:一对一、一对
  • 数据库中创建一学生

    千次阅读 2021-01-18 18:07:58
    展开全部SQL语言创建数据库和学生62616964757a686964616fe4b893e5b19e31333365643662表建立:[sql]create database zxlcreate table 学生(学号 char(12) primary key,姓名 char(6) not null,性别 char(2) check...
  • 层次关系数据库的设计

    千次阅读 2021-01-28 19:52:15
    数据层次是表达数据的一种重要关系,在数据库的设计中,如:组织结构分解、工作任务分解、行政区划的分解等都是层次关系数据的典型实例。表达层次关系的数据一般需要实现如下属性:1.层次的最大级联层次数。如:中国...
  • SQL语句中两个表的连接

    千次阅读 2021-01-19 22:21:08
    四、结构不同的连接 当两多关系的时候,我们需要建立中间student_score,中间至少要有两的主键。 SQL语句:select s.Name,C.Cname from student_score as sc left join student as s on s.Sno=...
  • 比如下图:我生成了两张临时,将7-8张表中计算出的字段放到两张中,然后两张将具有共性的站点编号和油品名称进行聚合生成一约束字段strict,用strict进行关联即可实现唯一性约定 ...
  • 学习笔记·数据库的创建及查询文章目录学习笔记任务过程第一步:分析需求第二步:新建数据库第三步:新建1.Grade2.Student3.subject第三步:插入数据1.Grade2.Student3.subject第四步:查询测试1....
  • 多表合并且去掉重复项

    千次阅读 2021-01-28 04:14:15
    数据库问题:多个表中合并去掉重复项两个合并起来,去掉某行相同的项,正好把多查询系统复习一下:多查询 (也叫连接查询,此处为基于两个的连接查询)如果一个查询需要对多个表进行操作就称为连接查询,连接...
  • 不同表头的多表合并

    千次阅读 2020-12-24 07:52:15
    这次VBA的目标就是把不同工作内的不同表头(即列标题有所不同)的表格进行汇总到一张内。先来看下这张汇总表格有什么地方是值得注意的:列标题与数据是一一对应的,来自哪个的数据就对应行标题来自哪个表格列...
  • ,从,关联,父,子

    千次阅读 2021-01-27 03:33:16
    一、前言在数据库设计中,Hibernate,iBatis等ORM框架的使用中经常听说主键,外键,主,从,关联,父,子之类的术语,弄懂它们之前的区别与联系对于数据库设计和ORM框架的学习使用是非常有必要的。...
  • MYSQL数据表建立外键

    2021-01-18 18:35:15
    MySQL创建关联可以理解为是两个表之间有外键关系,但这两个表必须满足三条件1.两个表必须是InnoDB数据引擎2.使用在外键关系的域必须为索引型(Index)3.使用在外键关系的域必须与数据类型相似例如:1、建立s_...
  • SQL多表关联

    千次阅读 2021-11-22 19:05:14
    张数据之间是可以有一定的关联关系,这种关联关系可以通过外键约束实现 多表的分类: 一对一 一对 一对一: 一张对应一张 适用场景举例: 人和身份证。一人只能有一身份证,一身份证...
  • IS-IS邻接关系建立过程

    千次阅读 2021-01-13 21:17:59
    Hello 报文中除了包含发送路由器的System-ID之外,还包含了发送端全局和接口的一系列参数,这些参数如果被邻居路由器接受了,那么就能形成邻接关系,否则不建立邻接关系。 在LAN (广播网络)和P2P (点对点网络)中形成...
  • 根据删除另一个表_MySQL

    千次阅读 2021-01-19 13:22:29
    bitsCN.com根据删除另一个DELETE删除多数据,怎样才能同时删除多个关联的数据呢?这里做了深入的解释:1、 delete from t1 where 条件2、delete t1 from t1 where 条件3、 delete t1 from t1,t2 where 条件4...
  • 索引使用简介一、 关于索引的知识要写出运行效率高的sql,需要对索引的机制...对于dml操作比较频繁的,索引的个数不宜太。2、 什么样的列需要建索引?经常用于查询、排序和分组的列(即经常在where、order或grou...
  • OSPF邻接关系建立过程

    千次阅读 2020-12-23 20:58:29
    Init:在此状态下,路由器已经从邻居收到了Hello报文,但是自己的router-id不在所收到的Hello报文的邻居列表中,表示尚未与邻居建立双向通信关系。在此状态下的邻居要被包含在自己重新产生的Hello报文中,并且发送。...
  • MySQL 创建用户和好友

    千次阅读 2021-01-18 18:43:27
    人生如果错了方向,停止就是进步最近想做一即时通讯的Android demo,但是一直不知道如何处理用户和好友之间的表关系。在网上找了好久也没找到合适的。我本人很少接触数据库,对数据库语句比较差。但是这只是自己...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,157,692
精华内容 463,076
关键字:

多个表的关系表怎么建立