1. 程式人生 > >04-----外鍵的變種 三種關系

04-----外鍵的變種 三種關系

spl url span reference pda ima delete 圖片 where

重點:

如何找出兩張表之間的關系

表的三種關系

一、介紹

因為有foreign key的約束,使得兩張表形成了三種了關系:

  • 多對一
  • 多對多
  • 一對一

二、重點理解如果找出兩張表之間的關系

分析步驟:

#1、先站在左表的角度去找
是否左表的多條記錄可以對應右表的一條記錄,如果是,則證明左表的一個字段foreign key 右表一個字段(通常是id)

#2、再站在右表的角度去找
是否右表的多條記錄可以對應左表的一條記錄,如果是,則證明右表的一個字段foreign key 左表一個字段(通常是id)

#3、總結: #多對一: 如果只有步驟1成立,則是左表多對一右表 如果只有步驟2成立,則是右表多對一左表 #多對多 如果步驟1和2同時成立,則證明這兩張表時一個雙向的多對一,即多對多,需要定義一個這兩張表的關系表來專門存放二者的關系 #一對一: 如果1和2都不成立,而是左表的一條記錄唯一對應右表的一條記錄,反之亦然。這種情況很簡單,就是在左表foreign key右表的基礎上,將左表的外鍵字段設置成unique即可

三、標的三種關系

(1)書和出版社

一對多(或多對一):一個出版社可以出版多本書。看圖說話。

關聯方式: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 | +----+-----------------+----------+ rows in set (0.00 sec) mysql> select * from press; +----+--------------------------------+ | id | name | +----+--------------------------------+ | 1 | 北京工業地雷出版社 | | 2 | 人民音樂不好聽出版社 | | 3 | 知識產權沒有用出版社 | +----+--------------------------------+ rows in set (0.00 sec)
書和出版社(多對一)

(2)作者和書籍的關系

多對多:一個作者可以寫多本書,一本書也可以有多個作者,雙向的一對多,即多對多。看圖說話。

關聯方式:foreign key +一張新的表

技術分享圖片

技術分享圖片
# 創建被關聯表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 |
+----+-----------+---------+
rows in set (0.00 sec)
作者與書籍關系(多對多)

(3)用戶博客

一對一:一個用戶只能註冊一個博客,即一對一的關系。看圖說話

關聯方式:foreign key+unique

技術分享圖片

技術分享圖片
#例如: 一個用戶只能註冊一個博客

#兩張表: 用戶表 (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;
用戶和博客(一對一)

04-----外鍵的變種 三種關系