看板 Database 關於我們 聯絡資訊
※ 引述《forgmonkey (悲情城市之悲情程式猿)》之銘言: : 正遇到問題呢... : 想說ptt有DB板 沒想到居然剛開板ㄟ... 酷斃了!! : 恭賀會研究用哪種鍵盤打java快的PSMonkey成為版主 : 同是monkey推!!! : 好啦.. 以下是問題: : mysql下 primary key可以設定auto increase : 他實作方式是會紀錄一個數字 : 每次Insert一筆資料就會拿這個數字當primary key 並且遞增之 : 但是我遇到一個問題... 今天我新增10個資料 : 就有主鍵1~10的這幾筆資料 : 然後刪掉4 ,6, 剩下8筆 : 然後再新增一筆 我希望他會成為主鍵4而不是11 : 能夠在SQL的語法那邊就解決掉嘛? : 還是必須每次插入都要用程式檢查最小的空欄是哪一個? : 不過我想這種方式因該load太大吧? : //以下有點題外話 : 會有這個困難 起因是比方這個資料表叫A 有另外一個資料表B靠A的主鍵與之關聯 : 如果A4被刪掉 那所有B中和a4關聯的全部變成無主孤魂啊 : 我想到的另一種方式是... 乾脆刪掉a4時,順便殺掉b中和a4關聯的東西... 看來似乎很多人都不曉得mysql有foreign key constrain喔? 在建立資料表的時候只要選用Innodb作為資料表格式(很多狀況下新建立 的資料表格式是myisam,這種格式就沒有foreign key constrain了), 不但有transaction功能也有foreign key constrain,而且這從mysql 3.2x 的時代就有了(至少兩三年以上),不是最近的事情。 你所說的B資料表的記錄參照到A資料表,當A資料表某筆記錄被刪掉,造成 B資料表中參照到該被刪資料的記錄都變成無主孤魂的問題,就是要靠 foreign key constrain來處理(當然你也可以在應用程式的層級自己寫 程式碼處理這個問題,但是在資料庫層級做好各資料表之間的關連與限制 是好的,而且省事多了)。設定正確的話,你可以有以下選擇 1. 當A4被刪掉,B資料表中參照到A4的資料也會被自動刪除(on delete cascade) 如果有C資料表參照到B,C中參照到B的資料也會被連動自動刪除。 2. 當A4被刪掉,B資料表中參照到A4的資料關連的欄位值會被自動設為null (on delete set null) 3. 當B資料表中有參照到A4的資料時,則不允許刪除A4這筆記錄(on delete restrict) 硬要刪除A4會有錯誤訊息。 這些功能可以讓你確保各資料表之間的完整關連性,不會有孤兒資料存在。 而且不用自己寫一堆程式碼來維持這些關連,實在是必備良藥。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 202.154.199.81
drkkimo:mysql的foreign key好像是 5.0以後才有的~ 06/24 14:09