2009-11-10 31 views
0

假設我有兩個表維護誠信

1日EMP表

EmpID | EmpName|xyz...coloums 

1. | Hrishi | 
2. | Nikhil | 
3. | Hrishi | 

第二表系

DeptId |EmpId |Deptname....Xyz coloum 

1. |1 |computer 

有emp和部門臺之間的一個一對多的關係。

現在我想調用一個存儲過程,其中 empName將是一個輸入。這個存儲過程將在empName = Hrishi的department表中插入empId。當然,這是不明確的。

哪個hrishi會從emp表第1或第3選擇?

我應該如何處理這個senario?

+2

你沒問這個,但這裏的答案呢。您的部門表格不是第2種常規表格。 Deptname在所有在部門工作的員工中重複使用。如果其中一行出現拼寫錯誤,則表明您的數據庫自相矛盾。最好有三張表,emp,extrapert和emp_department。 – 2009-11-10 15:36:06

回答

2

答案是,您應該使用輸入存儲過程是明確的,如員工id,而不是員工名稱。在用戶界面中,您可以允許用戶按名稱選擇用戶,包括足夠的信息(如電子郵件,辦公室號碼等),以便他們選擇正確的用戶。但是,您的程序在調用存儲過程時將使用選定員工的ID。

0

這會導致問題。

當插入外鍵引用時,您應該始終將外鍵值傳遞給存儲過程...否則數據不保證是唯一的。

就你而言,你的存儲過程應該採用EmpId而不是EmpName。調用代碼可能需要修改以處理存儲過程......但這是每次獲得正確結果的唯一方法。

0

它們返回的順序是未定義的。

你基本上不應該有重複,所以你應該對EmpName有一個UNIQUE約束。或者編寫代碼來處理你所描述的情況。

1

有幾個選項這取決於你的使用情況:

  1. 強制對員工姓名唯一約束。這不是一個好的解決方案,但是我們通常在我們的數據倉庫中應該做的。

    CREATE UNIQUE NONCLUSTERED INDEX [ixu_employee_name] ON [EMP] [EmpName] ASC )

  2. 同時顯示結果給用戶,並允許他們選擇正確的一個。這在Intranet應用程序中可能有意義。 EmpID的潛在唯一鍵只是代表一個單獨的員工實體。如果您打算這樣做,那麼您應該顯示多列信息和可能的員工圖像,以便用戶更容易區分人與人之間的差異。

0

一般來說,只要你有一個查詢,做到這一點:

select <primary key> from <table> where <other column> = <value> 

意味着<other column>是獨一無二的。您需要在Emp.EmpName上創建唯一約束並清理數據以符合該約束。如何清理數據取決於您的業務需求。

1

主鍵的(唯一的)用途是唯一標識表中的一行。您應該只有一個位置在數據庫或應用程序中,其中生成主鍵。最簡單的方法是使用AUTO-INCREMENT字段。

如果你按照這個,並把這個例子在2NF你的問題將解決自己。

  • Department表中刪除EmpID,它不屬於那裏。

  • DeptID代入Employee表。

    dept_model_01