iT邦幫忙

DAY 28
8

MySQL那些事兒系列 第 28

關於外鍵限制的探討(一)

以第26天的泰大與MM們的為例.
有三個TABLE,分別是Girls,Billings,Worklog.
但未設外鍵限制.
今天將新增外鍵限制,來看增加了外鍵限制後,
會出現的情況.
修改Table,增加外鍵限制.

ALTER TABLE Billings
  ADD CONSTRAINT FOREIGN KEY (galid) REFERENCES Girls (galid);

ALTER TABLE Worklog
  ADD CONSTRAINT FOREIGN KEY (galid) REFERENCES Girls (galid);

當增加外鍵限制以後,在Billings嘗試輸入5號,而5號在Girls並沒有資料,
如下所示:

INSERT INTO Billings(galid, bill_date, bill_rate) VALUES
(5, '2013-01-01', 35);

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`akina`.`Billings`, CONSTRAINT `Billings_ibfk_1` FOREIGN KEY (`galid`) REFERENCES `Girls` (`galid`))

會出現錯誤訊息! 無法隨意新增.
如要UPDATE,也會受到限制.
如下所示:

UPDATE Billings
   SET galid = 5
 WHERE galid = 1;

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`akina`.`Billings`, CONSTRAINT `Billings_ibfk_1` FOREIGN KEY (`galid`) REFERENCES `Girls` (`galid`))

一樣會受到限制!

那UPDATE Girls的呢?

UPDATE Girls
   SET galid = 5
 WHERE galid = 1;

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`akina`.`Billings`, CONSTRAINT `Billings_ibfk_1` FOREIGN KEY (`galid`) REFERENCES `Girls` (`galid`))

一樣是受到限制,訊息不同.一個是child,另一個是parent.

當要把Girls的1號刪除:

DELETE 
  FROM Girls
 WHERE galid = 1;

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`akina`.`Billings`, CONSTRAINT `Billings_ibfk_1` FOREIGN KEY (`galid`) REFERENCES `Girls` (`galid`))

因為有Child的資料,所以Parent的資料無法刪除.

這樣就確保了資料之間的關聯正常,以避免Parent的資料刪除了,
而相關的Child的資料,會出現NULL的狀況.

而外鍵限制卻不只上述的情況,留待明天繼續討論.


上一篇
應用實例(四) 分段費用計算再次探討
下一篇
關於外鍵限制的探討(二)
系列文
MySQL那些事兒30

2 則留言

0
總裁
iT邦好手 1 級 ‧ 2013-10-28 15:06:47

不能算鐘點的嗎??....疑惑

是算鐘點的啊??但是會漲價.
前兩天有泰大的賬單計算啊.
沒漲價那個,就服務時間最長.

ted99tw iT邦高手 1 級‧ 2013-10-28 15:33:36 檢舉

hitomitanaka提到:
因為有Child的資料,所以Parent的資料無法刪除

既然在忙著ForeignKing,不然Child先刪也行...

要把Child都刪掉,才能刪Parent的.
這是明天的菜.
哈哈

0
總裁
iT邦好手 1 級 ‧ 2013-10-28 15:59:36

ted99tw提到:
不然Child

連孩子都有了,這下可不是跑到國外問題就能解決了....汗暈

欲知結局如何,請關注明天後續發展及後天的大結局.

我要留言

立即登入留言