Python 資料庫開發系列(五):SQLite外鍵的設置與使用

更新於 發佈於 閱讀時間約 6 分鐘

上一回我們介紹了如何透過程式碼對資料表進行插入(INSERT)、刪除(DELETE)及更新(UPDATE)。這一回我們將來介紹外鍵(Foreign Key)

假如我們要新增供應商的欄位,供應商可能包含了名字、電話及地址等資訊,如果我們單純的將所有欄位都直接設置在同一張表單上(如下圖),在資料筆數不多的情況下可能還好,但隨著資料數增長,供應商的名字和電話號碼可能會一直重複出現,而每次輸入資料都得重新輸入一次,修改也必須一筆一筆手動修改。假設有1000筆資料,其中有500筆資料的供應商都是開拓食品,如果他今天改了電話號碼,我們就得手動修改500筆資料,這必然是件非常耗時、沒效率的作法。

raw-image

所以就輪到我們這次的主角——外鍵(Foreign Key)登場了,外鍵的作用:

  1. 建立關聯:將兩張資料表連結在一起,例如關聯供應商和材料庫存的資料表。
  2. 確保資料一致性:防止出現孤兒紀錄,比如不能在材料庫存的資料表中隨便填一個不存在的供應商。
  3. 維護資料完整性:外鍵可以防止刪除或更新父表中的資料,而導致子表中存在無效的參考資料,從而保證資料的完整性。
就像身分證字號一樣,當你在銀行開戶時,銀行會記錄你的身分證字號來確認你的身分。這個身分證字號就像外鍵,它必須是真實存在的,而且能夠連結到你的個人資料,當你的個人資料有任何修改都能夠即時反映。

補充說明:其實上述內容就是資料庫正規化中的第二正規化(2NF),所有非主鍵欄位都完全依賴於主鍵,比如材料庫存中的欄位都必須依賴於ID,而不會有供應商電話依賴於供應商的情形(避免部分相依)。

創建供應商的資料表

接下來,我們使用DB Browser打開上回的Ingredient.db,並點選建立資料表:

資料表命名為Supplier,欄位如下:

  1. ID─供應商的ID,整數型態、主鍵、自動增值。
  2. Name─供應商的名稱,字串型態。
  3. Phone─供應商的電話,字串型態。

確認無誤後點選「OK」進行建立,確認建立完成後記得寫入變更。

raw-image

接下來我們先直接在DB Browser建立兩筆供應商資料,分別是開拓食品和黃隆食品,電話分別為(02)1234-5678、(02)8888-9999:

raw-image

建立外鍵

再來回到資料庫結構的索引標籤,對ingredient點選修改表格:

raw-image

新增一個欄位,命名為Supplier_ID,並在後方外鍵的欄位中設定關聯Supplier的ID欄位,並在後方輸入ON DELETE RESTRICT ON UPDATE CASCADE:

raw-image

創建完成後,再到瀏覽資料的索引標籤中,為我們原先的三筆資料加上Supplier_ID,分別為1、1、2:

raw-image

補充一下:

  1. ON DELETE RESTRICT:不能刪除還有在供應庫存的供應商。
  2. ON UPDATE CASCADE:如果供應商ID改變,庫存表中的供應商ID會自動更新。

除了CASCADE和RESTRICT外,還有NO ACTION(SQLite預設)、SET NULL,實際差異日後會再補充。

測試查詢資料

現在我們回到Python,使用以下程式碼查詢包括供應商名稱、電話欄位在內的資料:

import sqlite3

con = sqlite3.connect("Ingredient.db")
cur = con.cursor()
cur.execute('''
            SELECT i.Name, i.Amount, i.Unit, s.Name, s.Phone
            FROM ingredient i
            INNER JOIN Supplier s ON i.Supplier_ID = s.ID
            ;''')
rows = cur.fetchall()
for row in rows:
    print(row)

查詢外鍵關聯表的其他欄位,主要透過 JOIN 來實現,SQLite中又分成INNER JOIN、LEFT JOIN,差異如下:

  1. INNER JOIN:只返回有關聯的記錄,預設的JOIN為此種。
  2. LEFT JOIN:返回左表所有記錄,右表沒有對應則為 NULL。
補充:在其他關聯式資料庫中還有RIGHT JOIN等其他種類,但我們在這裡只以SQLite有支援的為主。

i和s則分別是ingredient和Supplier兩張資料表的別名(alias),可自行設置,僅是方便辨認及使用。

程式碼執行後會得到以下結果:

raw-image

這樣代表我們可以透過ingredient中的Supplier_ID欄位查找到供應商的名稱、電話,
而之後要修改供應商的電話或名稱,僅需修改Supplier這張資料表中的資料即可,比如開拓食品的電話號碼要進行修改,只要到Supplier中修改開拓食品的電話號碼就好(1筆),以方才提到的例子來說,要修改的數量瞬間從500筆降到1筆,效率大幅提高。

下一步

這一回我們介紹了外鍵的原理,並且為ingredient資料表設置了關聯到供應商的外鍵,並且使用程式碼進行查詢。不知道各位是否覺得輸出結果不太容易讀懂?因為完全沒有對應的欄位,僅有一條一條的資料內容,就好像讀書沒有標題和回目一樣。於是下一回我們除了介紹如何在Python中插入有外鍵的資料外,我們還會在介紹一個常見的套件─pandas中的DataFrame。

留言
avatar-img
留言分享你的想法!
avatar-img
SlimeE的沙龍
0會員
5內容數
努力向上中,試著將所學的東西分享出來。
SlimeE的沙龍的其他內容
2025/06/24
上一回我們介紹了DB Browser for SQLite(DB4S),並透過DB4S進行資料庫及資料表的建立,接下來我們將回到Python,透過Python對資料庫進行資料的插入、修改及刪除。 開始前,我們先在DB4S創建一個名為Ingredient.db的資料庫,用於紀錄食品材料的庫存,資料表
2025/06/24
上一回我們介紹了DB Browser for SQLite(DB4S),並透過DB4S進行資料庫及資料表的建立,接下來我們將回到Python,透過Python對資料庫進行資料的插入、修改及刪除。 開始前,我們先在DB4S創建一個名為Ingredient.db的資料庫,用於紀錄食品材料的庫存,資料表
2025/06/10
上一篇我們介紹了如何在Python中使用sqlite3進行SQLite資料庫的創建,並進行了簡易的驗證,結尾我們提到了:怎麼知道資料表真的建立成功了?有沒有更直觀的方式可以查看和管理資料庫? 於是我們這次要來介紹一個好用的工具──DB Browser for SQLite(DB4S)。 DB B
2025/06/10
上一篇我們介紹了如何在Python中使用sqlite3進行SQLite資料庫的創建,並進行了簡易的驗證,結尾我們提到了:怎麼知道資料表真的建立成功了?有沒有更直觀的方式可以查看和管理資料庫? 於是我們這次要來介紹一個好用的工具──DB Browser for SQLite(DB4S)。 DB B
2025/06/03
上一篇我們簡單介紹了SQLite的概述及應用,這次我們將介紹如何使用Python的sqlite3套件進行資料庫及Table的創建。 創建資料庫 首先,我們需要先創建資料庫的檔案: import sqlite3 con = sqlite3.connect("tutorial.db") 透過sq
2025/06/03
上一篇我們簡單介紹了SQLite的概述及應用,這次我們將介紹如何使用Python的sqlite3套件進行資料庫及Table的創建。 創建資料庫 首先,我們需要先創建資料庫的檔案: import sqlite3 con = sqlite3.connect("tutorial.db") 透過sq
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
※ 何時該使用 JOIN? JOIN 使用的時機是:當你需要同時查詢一張以上的資料表的時候。 ※ SQL有哪些TABLE JOIN的方式? INNER JOIN LEFT JOIN RIGHT JOIN SELF JOIN ※ 使用 JOIN 的時候,我們需要考慮到: 我要使用哪一種
Thumbnail
※ 何時該使用 JOIN? JOIN 使用的時機是:當你需要同時查詢一張以上的資料表的時候。 ※ SQL有哪些TABLE JOIN的方式? INNER JOIN LEFT JOIN RIGHT JOIN SELF JOIN ※ 使用 JOIN 的時候,我們需要考慮到: 我要使用哪一種
Thumbnail
※ 關聯式資料庫(RDBMS)是什麼? 關聯式資料庫(RDBMS)是一種傳統的資料庫系統,以結構化查詢語言(SQL)為基礎,將資料儲存於預定義的表格中。這些表格包括行和列,彼此之間存在明確的關聯性。 ※ 關聯式資料庫(RDBMS)有兩個重要元素: 關聯(Relational): 關聯式資料庫
Thumbnail
※ 關聯式資料庫(RDBMS)是什麼? 關聯式資料庫(RDBMS)是一種傳統的資料庫系統,以結構化查詢語言(SQL)為基礎,將資料儲存於預定義的表格中。這些表格包括行和列,彼此之間存在明確的關聯性。 ※ 關聯式資料庫(RDBMS)有兩個重要元素: 關聯(Relational): 關聯式資料庫
Thumbnail
種類 SQL指令分三大部分: 資料定義語言(Data Definition Language,DDL):建立資料表、索引和檢視表等,和定義資料表的欄位。 資料操作語言(Data Manipulation Language,DML):資料表紀錄查詢、插入、刪除和更新指令。 資料控制語言(Dat
Thumbnail
種類 SQL指令分三大部分: 資料定義語言(Data Definition Language,DDL):建立資料表、索引和檢視表等,和定義資料表的欄位。 資料操作語言(Data Manipulation Language,DML):資料表紀錄查詢、插入、刪除和更新指令。 資料控制語言(Dat
Thumbnail
依照上圖的資料表創建出公司的資料庫 Employee CREATE TABLE `employee`( `emp_id` INT PRIMARY KEY, `name` VARCHAR(20), `birth_date` DATE, `sex`VARCHAR(1), `salary
Thumbnail
依照上圖的資料表創建出公司的資料庫 Employee CREATE TABLE `employee`( `emp_id` INT PRIMARY KEY, `name` VARCHAR(20), `birth_date` DATE, `sex`VARCHAR(1), `salary
Thumbnail
SQL 基本篇 - CRUD、運算子、內建函式
Thumbnail
SQL 基本篇 - CRUD、運算子、內建函式
Thumbnail
在這一課中,我們將學習如何在Python中使用sqlite3模塊進行基本的資料庫操作。 創建資料庫和表 首先,我們需要創建一個資料庫和一個表。
Thumbnail
在這一課中,我們將學習如何在Python中使用sqlite3模塊進行基本的資料庫操作。 創建資料庫和表 首先,我們需要創建一個資料庫和一個表。
Thumbnail
在前面的文章中已經在supabase中完成了基本的操作,甚至已經完成訂閱即時更新的功能,接著本篇文章要介紹的是如何在supabase裡設定與使用外來鍵,包含如何在客戶端撰寫查詢外鍵的SQL,馬上開始。如果還沒有閱讀實時更新功能文章的話可以點擊這裡去閱讀。 嗨歡迎閱讀我的文章!這是關於Supabase
Thumbnail
在前面的文章中已經在supabase中完成了基本的操作,甚至已經完成訂閱即時更新的功能,接著本篇文章要介紹的是如何在supabase裡設定與使用外來鍵,包含如何在客戶端撰寫查詢外鍵的SQL,馬上開始。如果還沒有閱讀實時更新功能文章的話可以點擊這裡去閱讀。 嗨歡迎閱讀我的文章!這是關於Supabase
Thumbnail
在Visual Studio裡有內建的SQL幫助我們存資料,SQL指的是資料庫,那麼我們就用註冊會員這個例子來看一下怎麼使用內建的SQL吧~ 最後面有寫非常基本的SQL相關語法可以做參考 Step 1:建立資料庫
Thumbnail
在Visual Studio裡有內建的SQL幫助我們存資料,SQL指的是資料庫,那麼我們就用註冊會員這個例子來看一下怎麼使用內建的SQL吧~ 最後面有寫非常基本的SQL相關語法可以做參考 Step 1:建立資料庫
Thumbnail
在資料庫管理中,SQL(Structured Query Language)是一種強大的工具,用於處理資料庫中的資料。本篇教學將介紹 SQL 中的基本操作,包括 SELECT、UPDATE、INSERT 和 DELETE,讓您能夠有效地查詢、更新、插入和刪除資料。
Thumbnail
在資料庫管理中,SQL(Structured Query Language)是一種強大的工具,用於處理資料庫中的資料。本篇教學將介紹 SQL 中的基本操作,包括 SELECT、UPDATE、INSERT 和 DELETE,讓您能夠有效地查詢、更新、插入和刪除資料。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News