zoukankan      html  css  js  c++  java
  • mysql外键的三种关系

    因为有foreign key的约束,使得两张表形成了三种了关系:

    • 多对一
    • 多对多
    • 一对一

    一对多或多对一

    create table press(
        id int primary key auto_increment,
        name varchar(20)
    );
    
    create table book(
        id int primary key auto_increment,
        name varchar(20),
        press_id int not null,
             constraint fk_book_press foreign key(press_id) references press(id)
        on delete cascade
        on update cascade
    );
    
    # 先往被关联表中插入记录
    insert into press(name) values
    ('北京工业地雷出版社'),
    ('人民音乐不好听出版社'),
    ('知识产权没有用出版社')
    ;
    
    # 再往关联表中插入记录
    insert into book(name,press_id) values
    ('九阳神功',1),
    ('九阴真经',2),
    ('九阴白骨爪',2),
    ('独孤九剑',3),
    ('降龙十巴掌',2),
    ('葵花宝典',3)
    ;
    
    查询结果:
    mysql> select * from book;
    +----+-----------------+----------+
    | id | name            | press_id |
    +----+-----------------+----------+
    |  1 | 九阳神功        |        1 |
    |  2 | 九阴真经        |        2 |
    |  3 | 九阴白骨爪      |        2 |
    |  4 | 独孤九剑        |        3 |
    |  5 | 降龙十巴掌      |        2 |
    |  6 | 葵花宝典        |        3 |
    +----+-----------------+----------+
    6 rows in set (0.00 sec)
    
    mysql> select * from press;
    +----+--------------------------------+
    | id | name                           |
    +----+--------------------------------+
    |  1 | 北京工业地雷出版社             |
    |  2 | 人民音乐不好听出版社           |
    |  3 | 知识产权没有用出版社           |
    +----+--------------------------------+
    3 rows in set (0.00 sec)
    多对一

    多对多,引入第三张表

    # 创建被关联表author表,之前的book表在讲多对一的关系已创建
    create table author(
        id int primary key auto_increment,
        name varchar(20)
    );
    #这张表就存放了author表和book表的关系,即查询二者的关系查这表就可以了
    create table author2book(
        id int not null unique auto_increment,
        author_id int not null,
        book_id int not null,
        constraint fk_author foreign key(author_id) references author(id)
        on delete cascade
        on update cascade,
        constraint fk_book foreign key(book_id) references book(id)
        on delete cascade
        on update cascade,
        primary key(author_id,book_id)
    );
    #插入四个作者,id依次排开
    insert into author(name) values('egon'),('alex'),('wusir'),('yuanhao');
    
    # 每个作者的代表作
    egon: 九阳神功、九阴真经、九阴白骨爪、独孤九剑、降龙十巴掌、葵花宝典
    alex: 九阳神功、葵花宝典
    wusir:独孤九剑、降龙十巴掌、葵花宝典
    yuanhao:九阳神功
    
    # 在author2book表中插入相应的数据
    
    insert into author2book(author_id,book_id) values
    (1,1),
    (1,2),
    (1,3),
    (1,4),
    (1,5),
    (1,6),
    (2,1),
    (2,6),
    (3,4),
    (3,5),
    (3,6),
    (4,1)
    ;
    # 现在就可以查author2book对应的作者和书的关系了
    mysql> select * from author2book;
    +----+-----------+---------+
    | id | author_id | book_id |
    +----+-----------+---------+
    |  1 |         1 |       1 |
    |  2 |         1 |       2 |
    |  3 |         1 |       3 |
    |  4 |         1 |       4 |
    |  5 |         1 |       5 |
    |  6 |         1 |       6 |
    |  7 |         2 |       1 |
    |  8 |         2 |       6 |
    |  9 |         3 |       4 |
    | 10 |         3 |       5 |
    | 11 |         3 |       6 |
    | 12 |         4 |       1 |
    +----+-----------+---------+
    12 rows in set (0.00 sec)
    多对多

    一对一的情况

    #例如: 一个用户只能注册一个博客
    
    #两张表: 用户表 (user)和 博客表(blog)
    # 创建用户表
    create table user(
        id int primary key auto_increment,
        name varchar(20)
    );
    # 创建博客表
    create table blog(
        id int primary key auto_increment,
        url varchar(100),
        user_id int unique,
        constraint fk_user foreign key(user_id) references user(id)
        on delete cascade
        on update cascade
    );
    #插入用户表中的记录
    insert into user(name) values
    ('alex'),
    ('wusir'),
    ('egon'),
    ('xiaoma')
    ;
    # 插入博客表的记录
    insert into blog(url,user_id) values
    ('http://www.cnblog/alex',1),
    ('http://www.cnblog/wusir',2),
    ('http://www.cnblog/egon',3),
    ('http://www.cnblog/xiaoma',4)
    ;
    # 查询wusir的博客地址
    select url from blog where user_id=2;
    一对一
  • 相关阅读:
    JavaScript-Runoob:JavaScript JSON
    JavaScript-Runoob:JavaScript let 和 Const
    JavaScript-Runoob:JavaScript this 关键字
    System.AttributeTargets.cs
    笔记-bat:列表
    Nginx模块举例说明
    Docker拉取镜像报错 uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
    Mysql聚簇索引和非聚簇索引的区别
    Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php
    百度ueditor编辑支持word内容和截图的复制黏贴
  • 原文地址:https://www.cnblogs.com/mmyy-blog/p/9626840.html
Copyright © 2011-2022 走看看