程式狂想筆記

一個攻城師奮鬥史

0%

主表和關聯表要不要全刪 和 外來鍵一些整理

最近無聊想一些無聊的事情
最近做 db 主表刪除,在想一些關聯表是不是也要跟著刪除
雖然可以用INNER(or LEFT) JOIN容錯
但我還想知道一般正常開發者會不會做delete(我之前公司好像沒有這樣習慣)
不過,假如要刪除會選哪一種刪除方法
目前知道用

  1. DB 設定 table 結構刪除
  2. DB 設定 trigger
  3. 程式手動設定刪除

不知這幾種會用哪一種,所以網路上找到一些答案整理

外來鍵

有看到幾篇,說外來鍵很吃 DB 效能
正常可以用程式邏輯去解決掉
不過當然設定外來鍵可以減少資料不正確問題
目前看到有報表程式會用到外來鍵

問題引入
以前的意識裡都是需要建立外鍵,外鍵能起到約束作用,能保證數據的完整性和一直性,比如如果沒有外鍵約束,你自己程序控制又不到位把基本信息都刪除了,詳情卻存在,人的基本信息不存在了,工資信息裡卻存在這個人,想要找這個人究竟是誰都找不到。
今天看到原來的外鍵都被去掉了,問了下組長,結果回答就兩個字「效率」,雖然感覺很詫異,但是畢竟人家比我有經驗並沒有去爭論,下面將站在兩個對立面去贊成和反對建立外鍵。
作者:qq_23473123
来源:CSDN
原文:https://blog.csdn.net/qq_23473123/article/details/79273066
版权声明:本文为博主原创文章,转载请附上博文链接!

今天看到這篇,果然過來人經驗還是要聽的
之前我前公司我在開發 table
設定多個主鍵我是依照需求開的(我前公司沒有用 id 當主鍵)
我有一個前輩跟我講這樣設計不會很好
程式會缺乏彈性,以後需求變動不是很好改
通常可以用程式邏輯去做判斷

相關外來鍵設定

1
2
3
4
5
6
7
8
[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
參數解釋:

CASCADE - 會將有所關聯的紀錄行也會進行刪除或修改。
SET NULL - 會將有所關聯的紀錄行設定成 NULL。
NO ACTION - 有存在的關聯紀錄行時,會禁止父資料表的刪除或修改動作。
RESTRICT - 與 NO ACTION 相同。

簡單小記,使用外來鍵
主表和關聯表,從關聯表設定外來鍵,這樣主表要先建立對應 id
關聯表才能新增資料
反之
主表要先刪除關聯表資料,主表才能做刪除動作(PS: 這些動作都是看你設定什麼)

不過,我覺得還是要看情況,以許是很死的東西(ex:報表、會計)
可以用 table,這樣能更確定資料的安全
但大部分系統可能不用加入外來鍵

主表刪除,關聯表是否會刪除

這個問題網路上找不到人討論這個問題
我之前是沒有刪除,但最近想到這個問題
仔細想想舊資料殘留在上面好像浪費空間
又沒有意義,假如沒有特需用途還是手動刪除吧
結論還是無聊想一些無聊的事情手動刪除吧!!