顯示廣告
隱藏 ✕
看板 Knuckles_note
作者 Knuckles(阿德)
標題 [MySQL] 在phpMyAdmin 設定 foreign key
時間 2010年01月10日 Sun. PM 04:27:05


剛剛偶然得知資料庫有種叫 foreign key 的東西
可以將不同資料表的東西「關連」起來

舉例來說

像這個站的每個板,和每篇板裡的每篇文章
是分別用兩個資料表來儲存的

資料表 board 欄位: id  name     ...
             值:    1  test     ...
                    2  DISP_BBS ...

資料表 text  欄位: id  bi  author   title      ...
             值:    1   1  kk       測試       ...
                    2   1  Knuckles 測試一下   ...
                    3   2  abc      有Bug      ...
                    4   2  xyz123   問題       ...

所有看板的文章都是存在 text 裡面,以欄位 bi 來分別是哪個看板的
如果今天我刪掉了 board 裡的看板 test
那個看板裡的文章還是存在於 text 裡造成空間的浪費
除非我程式裡再加上刪除 bi=1 的文章

但如果我把 text.bi 設了 foreign key 參考到 board.id
那麼只要我在board刪除了某個板,則在text中相對應的文章就會自動被刪除掉了

但是在 phpMyAdmin 中卻找不到設定 foreign key 的選項...
Google了一下找到這篇文章 phpMyAdmin 設定 mysql foreign key

原來要使用 foreign key,兩個資料表的儲存引擎一定要使用 InnoDB

[圖]


如果沒有 InnoDB 這個選項,修改mysql設定檔: my.ini,將skip-innodb加#號註解,即#skip-innodb
重新啟動 mysql

設定好後在資料表結構的下面就會出現「關聯檢視」的選項

[圖]


點一下後就會出現 foreign key 的設定畫面

[圖]


將 bi 的參考設定為 board.id (注意兩個欄位的型態要相同)
ON DELETE 設定為 CASCADE,代表board某個row被刪掉時,text.bi=board.id的row也要跟著被刪除
另外也有 ON UPDATE 可以設定當 board.id 有更改時,text.bi要不要跟著更改

除了 CASCADE 外,也有 SET NULL, NO ACTION, RESTRICT 可以選
如果沒有設對應動作的話,則被參考的row會無法刪除

注意:
‧ 被連結的key必需設為主鍵或索引鍵
‧ 兩個相連結的資料型態必需相同
‧ 不能有不存在於被連結的資料中的值 (text.bi的值中有board.id中不存在的值)
   - 使用left join刪除多餘的值:
     DELETE text FROM text LEFT JOIN board ON text.bi = board.id where board.id is NULL

--
※ 來源: DISP BBS (http://disp.disp.cc)
※ 作者: Knuckles  來自: 114.43.123.194  時間: 2010-01-10 16:27:05
※ 編輯: Knuckles 時間: 2013-11-17 18:13:27
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 21011 
※ 文章分類: 資料庫 MySQL
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇
看板名稱: 確定(Enter) 取消(Esc) 搜尋(Space)
查詢帳號: 確定(Enter) 取消(Esc) 搜尋(Space)
搜尋: m)m文 b)進板 c)未分類 a)作者 /)標題 q)取消?[q]

搜尋 送出(Enter) 取消(Esc)

回覆文章至: f)看板 m)作者信箱 b)兩者皆是 q)取消?[f]
要引用原文嗎? y)引用原文 n)不引用 a)全部回覆 r)複製原文 q)取消?[y]
轉錄本文章於看板: 1)使用連結 2)使用複製 q)取消 ?[1]
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc) 全部(a)

確定要刪除這篇文章?(可按大U救回) 確定(Enter) 取消(Esc)

刪除理由:

確定(Enter) 取消(Esc)
加到這個分類: 確定(Enter) 下一層(→) 回上層(←) 取消(Esc)
你覺得這篇文章: 1)真讚 2)真瞎 q)取消?[1] (再選一次即可收回)
你覺得這篇文章: 1)值得推薦 2)表示反對 3)單純註解 q)取消?[3]
guest
預覽(Enter) 取消(Esc)
上傳圖片
按ctrl+Enter可輸入下一行。
guest
確定要送出? 確定(Enter) 取消(Esc) 繼續(e)
搜尋: 送出(Enter) 取消(Esc)

▏▎▍▌▋▊▉ 請按任意鍵繼續