你是不是也曾在數(shù)據(jù)庫設(shè)計時,被外鍵約束搞得頭大?今天咱們不講理論,就聊點實在的——今日外鍵約束怎么設(shè)置?
先來個真實案例:我上周幫一位朋友優(yōu)化電商后臺系統(tǒng),發(fā)現(xiàn)訂單表和用戶表之間居然沒有外鍵!結(jié)果呢?一個用戶刪了,訂單還在,數(shù)據(jù)亂成一鍋粥。他哭著說:“這不是bug,是災(zāi)難!”
所以,別再忽視外鍵了!它不是“錦上添花”,而是“雪中送炭”。那到底怎么設(shè)?看這里??
Q:MySQL里怎么加外鍵?
A:很簡單,用 ALTER TABLE 語句!比如你想讓訂單表的 user_id 引用用戶表的 id:
ALTER TABLE ordersADD CONSTRAINT fk_user_ordersFOREIGN KEY (user_id) REFERENCES users(id);
記住三點:1)外鍵字段必須有索引;2)引用表的主鍵或唯一鍵要存在;3)兩邊數(shù)據(jù)類型必須一致(比如都是 INT)。
Q:如果表已經(jīng)建好了,還能改嗎?
當(dāng)然能!但得小心。我之前就遇到過這種情況:表里有幾千條數(shù)據(jù),直接加外鍵報錯,因為有些訂單的 user_id 是空的或者不存在。怎么辦?
第一步:清理臟數(shù)據(jù):
UPDATE orders SET user_id = NULL WHERE user_id NOT IN (SELECT id FROM users);
第二步:加外鍵約束,這次就能成功啦!
Q:外鍵會影響性能嗎?
會一點點,但值不值得?絕對值!尤其在高并發(fā)場景下,外鍵能幫你防住“誤刪”“誤關(guān)聯(lián)”的坑。我有個客戶用了外鍵后,運維同事都說:“再也不怕半夜被叫起來查數(shù)據(jù)了?!?/p>
最后送你一句真心話:外鍵不是“限制”,而是“保護(hù)”。就像你給手機(jī)設(shè)密碼,不是為了麻煩自己,是為了更安心地用。
今天這篇,收藏起來吧!下次寫SQL前,記得問自己一句:外鍵設(shè)了嗎? ??

