09-Mysql資料庫----外鍵的變種

来源:https://www.cnblogs.com/dalaoban/archive/2018/08/31/9562724.html
-Advertisement-
Play Games

本節重點: 如何找出兩張表之間的關係 表的三種關係 一、介紹 因為有foreign key的約束,使得兩張表形成了三種了關係: 多對一 多對多 一對一 二、重點理解如果找出兩張表之間的關係 三、表的三種關係 (1)書和出版社 一對多(或多對一):一個出版社可以出版多本書。看圖說話。 關聯方式:for ...


本節重點:

  • 如何找出兩張表之間的關係
  • 表的三種關係

 

一、介紹

因為有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 |
+----+-----------------+----------+
6 rows in set (0.00 sec)

mysql> select * from press;
+----+--------------------------------+
| id | name                           |
+----+--------------------------------+
|  1 | 北京工業地雷出版社             |
|  2 | 人民音樂不好聽出版社           |
|  3 | 知識產權沒有用出版社           |
+----+--------------------------------+
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 |
+----+-----------+---------+
12 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;
用戶和博客(一對一)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 追加用戶組 追加新用戶 更改用戶 添加用戶到其他組 修改用戶密碼 刪除用戶 給用戶增加sudo許可權 切換超級用戶 添加sudo許可權 預設的sudoers文件是沒有寫入許可權的,需要增加許可權 修改sudoers文件 找到下麵root的代碼處 在之後追加以下代碼,保存退出 更改目錄和文件的訪問許可權 更改目 ...
  • 1、說明 所謂的PXE是Preboot Execution Environment的縮寫,字面上的意思是開機前的執行環境。 要實現pxe,至少需要3個服務 2、流程 註意:全部用的udp封裝 1)client向pxe server上的dhcp發送IP地址請求消息,dhcp檢測client是否合法,同 ...
  • 使用ntsd程式 (如果安裝過VS,在VS的安裝目錄下,比如“C:\Program Files (x86)\Debugging Tools for Windows (x86)\ntsd.exe”,也可以在這裡下載) 兩種方法 一種是使用進程的ID號,將PID換成對應進程ID號即可 一種是使用進程的名 ...
  • Linux日誌查找方法 適用於測試,開發,運維人員,用來查找Linux伺服器問題的一般方法,比較實用,如果有更好的辦法可以一塊討論,歡迎大神們來指導哈!!! 進入正題 第一步、通過Xshell登錄伺服器 鏈接方法—找度娘、開發同事#最好是自己找度娘,自給自足豐衣足食嘛賬號、密碼—找技術老大 第二步、 ...
  • 通過 Certbot 為 nginx 開啟https支持。 環境 CentOS 7.1 python2.x(這玩意系統里本來就有) 安裝Nginx 順手啟動: 順手設置開機啟動: 嗯,就完成了。 至於配置文件,會在後面設置。 配置https 此處我們使用 Let's Encrypt 提供的證書。且為 ...
  • 研究nginx優化時反覆安裝清理nginx,為方便做了一個簡單部署腳本,用的最新穩定版1.14.0,預設路徑,加入systemd系統進程管理中,可以通過systemd管理nginx的啟動、終止、重載、狀態、開機自啟等. 需要再次覆蓋nginx時,用awk找到nginx的進程然後kill掉,再次執行安 ...
  • 阿裡雲yum源速度快而且穩定,下麵給出配置方法 打開centos的yum文件夾 cd /etc/yum.repos.d/ 用wget下載repo文件 wget http://mirrors.aliyun.com/repo/Centos-7.repo 備份系統原來的repo文件 mv CentOS-B ...
  • 使用場景 linux管理員忘記root密碼,需要進行找回操作。 註意事項:本文基於centos7環境進行操作,由於centos的版本是有差異的,繼續之前請確定好版本。 步驟 一、重啟系統,在開機過程中,快速按下鍵盤上的方向鍵↑和↓。目的是告知引導程式,我們需要在引導頁面選擇不同的操作,以便讓引導程式 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...