線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1230
推到 Plurk!
推到 Facebook!

當某table內有not null的foreign key, 如何新增一項記錄

尚未結案
pasphi
一般會員


發表:16
回覆:12
積分:5
註冊:2002-11-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-10 00:28:38 IP:202.86.xxx.xxx 未訂閱
例: Table TA 內有一field f1, 它是not null並且是foreign key, reference to Table TB 內某一field. 當執行AdoTable.insert, 會出錯, 原因為f1必要有一個值. 但程序員也沒有理由在用戶未填入數據時, 任意填了這一 欄位, 請問應如何處理呢? DELphi==
------
DELphi==
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-10 00:51:52 IP:61.219.xxx.xxx 未訂閱
既然要定義 foreign key 這樣的關係, 在設計上就要解決對應的問題. 基本上, 可以在 TB 中加ㄧ筆資料 比如說 tbID=0, Data='未設定' 然後在 TA 的 tbID 欄位在資料庫中設定欄位預設值是 0. 應該就可以避掉這種問題了...
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-10 16:22:21 IP:211.22.xxx.xxx 未訂閱
引言: Table TA 內有一field f1, 它是not null並且是foreign key, reference to Table TB 內某一field. 當執行AdoTable.insert, 會出錯, 原因為f1必要有一個值. 但程序員也沒有理由在用戶未填入數據時, 任意填了這一欄位, 請問應如何處理呢?
我的觀念是~其實上述你所說的紅色那段話就道出了問題的所在!既然TA中的一個field是TB中的一個索引,且是forieng key,那麼為何在還未有TB的值就要有TA的值呢?是不是資料庫正規化沒做好?還是要作舊有系統的更新而遷就舊系統的格式?如果按此TB及TA中的資料沒有關連好,爾後新增到TB中的資料就會變成像是銀行的呆帳! 如果真要先新增TB的話,建議將思維反過來,也就是將TA中的一個field當作是TB中的一個field的索引,且該field是TB的foriegn key,而TB中那個not null的field就以「自動編號」來替代。 ----------------------- Practice makes perfect.
pasphi
一般會員


發表:16
回覆:12
積分:5
註冊:2002-11-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-16 14:03:54 IP:202.86.xxx.xxx 未訂閱
多謝你們的回覆 而就Stallion兄的答覆中,其實這資料庫設計我可以舉出一個例子: TA是記錄商戶的資料,如: name | f1 --------- ------ 大大公司 | 1 大元公司 | 3 而TB是記錄公司類型,如: f2 | description --------- -------------- 1 | 飲食業 2 | 工業 3 | 運輸業 而當delphi用一個form讓用戶輸入公司資料(TA), 則AdoTable.insert時, 若不給予f1值, 就會出錯, 但程序員又無理由預設為f1 = 1, 而就malanlk 兄所言, 可以在TB加一項記錄為"未設定", 但假設這個table是不可變, 大家會如何處理這些問題呢?
------
DELphi==
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-16 14:49:12 IP:211.22.xxx.xxx 未訂閱
問題很簡單~ 1.以此例而言TB本身是一個MASTER DATABASE,而它的每個FIELD都應該是UNIQUE,所以本身也應該有獨立的新增,修改,刪除功能。 2.TA本身也是一個MASTER DATABASE,只不過其中一個FIELD是要來自於TB,因此在新增TA時,其中一個FIELD就由TB中讀出後強制一定要使用者選擇一類,也就是說TA中的f1 foriegn key是TB中的f2。 3.可以設計的精巧一點,就是當使用者在新增TA時不選擇TB中的一種類別,而直接輸入一個新的類別,就詢問使用者是不是要新增一個新的種類至TB中(需要先檢查是否有重複鍵值),作為下次新增時新的選項。 4.以上請參考~ -----------------------
pasphi
一般會員


發表:16
回覆:12
積分:5
註冊:2002-11-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-26 11:42:02 IP:202.175.xxx.xxx 未訂閱
多謝兩位的幫忙,但對於這個問題,其實本人至今仍未想出 一個較為"標準"的做法。 我想malanlk兄提供的方法是比較接近實際所需,可惜實際應用中, 程式員和系統設計是分開的,程式員不能更改資料庫的設計。
------
DELphi==
系統時間:2024-06-27 22:38:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!