zoukankan      html  css  js  c++  java
  • 外键的变种

    表的三种关系:

      1,多对一。

      2,多对多。

      3,一对一。

    找出两张表的关系:

    分析步骤:
    #1、先站在左表的角度去找
    是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id)
    
    #2、再站在右表的角度去找
    是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)
    
    #3、总结:
    #多对一:
    如果只有步骤1成立,则是左表多对一右表
    如果只有步骤2成立,则是右表多对一左表
    
    #多对多
    如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系
    
    #一对一:
    如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可

    一对多:

      一个出版社可以出版很多书。

    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)

    一对一:

      用户和博客;

    mysql> create table user(id int primary key auto_increment,name varchar(20));
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> 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);
    Query OK, 0 rows affected (0.05 sec)
    
    mysql> insert into user(name) values('('alex'),')
        -> ('wusir'),
        -> ('egon'),
        -> ('xiaoma')
        -> c
    mysql> insert into user(name) values
        -> ('alex'),
        -> ('wusir'),
        -> ('egon'),
        -> ('xiaoma')
        -> ;
    Query OK, 4 rows affected (0.01 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> 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)
        -> ;
    Query OK, 4 rows affected (0.01 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> select * from user;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | alex   |
    |  2 | wusir  |
    |  3 | egon   |
    |  4 | xiaoma |
    +----+--------+
    4 rows in set (0.00 sec)
    
    mysql> select * from blog;
    +----+--------------------------+---------+
    | id | url                      | user_id |
    +----+--------------------------+---------+
    |  1 | http://www.cnblog/alex   |       1 |
    |  2 | http://www.cnblog/wusir  |       2 |
    |  3 | http://www.cnblog/egon   |       3 |
    |  4 | http://www.cnblog/xiaoma |       4 |
    +----+--------------------------+---------+
    4 rows in set (0.00 sec)
    
    mysql> select url from blog where user_id = 2;
    +-------------------------+
    | url                     |
    +-------------------------+
    | http://www.cnblog/wusir |
    +-------------------------+
    1 row in set (0.00 sec)
  • 相关阅读:
    SPOJ 694 (后缀数组) Distinct Substrings
    POJ 2774 (后缀数组 最长公共字串) Long Long Message
    POJ 3693 (后缀数组) Maximum repetition substring
    POJ 3261 (后缀数组 二分) Milk Patterns
    UVa 1149 (贪心) Bin Packing
    UVa 12206 (字符串哈希) Stammering Aliens
    UVa 11210 (DFS) Chinese Mahjong
    UVa (BFS) The Monocycle
    UVa 11624 (BFS) Fire!
    HDU 3032 (Nim博弈变形) Nim or not Nim?
  • 原文地址:https://www.cnblogs.com/stfei/p/9178366.html
Copyright © 2011-2022 走看看