2012-05-14 211 views
0

我知道如何創建一對一的關係問題是它需要兩個表中的行例如我有一個表如何在SQL Server 2008中創建1對1(或0)關係

emp_table => key1, key2, name, description 
emp_address_table => key1, key2, address 

系統不把強制性的約束上地址,以便在EMP可能存在,而無需他/她的地址,或者看起來是

1 EMP可以有最大的一個地址沒有更多的是:1(0)的關係

請讓我知道我該怎麼做,在SQL Server 2008中

+0

我的錯誤,我錯誤地創建1對1,它以任何方式感謝很多答案 –

回答

2

你不能有強制子行的存在,因爲你不能插入兩個約束行在同一時間。即無論您是先插入員工還是員工地址行,此時您都會遇到無效限制。

因此,SQL中的所有約束條件都是'0或更多',從不'1或更多'或'完全1'。

您可以通過將UNIQUE約束添加到emp_address表中的外鍵列來強制執行「0或1」約束。這將確保最多可以有一個emp_address表示給定員工的行。

+0

這是我問過的最傾銷問題,我當然沒有想好 –

0

嘗試

SELECT * 
FROM emp_table et 
LEFT OUTER JOIN emp_address_table edt ON et.key1 = edt.key1 AND et.key2 = edt.key2 
0

您不能強制使用限制其在子錶行。 (因爲你首先在父表中插入行,然後在子表中插入行 - 它不是一個操作,而是2,儘管它最可能是一個事務)

但是你可以使用存儲過程來插入數據,你可以在裏面進行驗證程序。

1

使用關聯表。這是更好的做法,無論如何,你可以使用它也實現0到N的關係很容易,其中:在關聯表

  • 缺席行表示0:0
  • 在每個實體的關聯表中的一行的存在表示在關聯表的倍數行的1至1
  • 存在(每實體)表示1〜許多

* EMP_TABLE *

key1 
key2 
name 
description 

* address_table *

addr_key 
address 

* emp_address_table *

key1 
key2 
addr_key 

在您的關聯表,使key1key2的外鍵引用回到你的員工表,addr_key將外鍵引用返回到地址表。如果您想執行1對1關係,請在關聯表上爲key1, key2設置唯一的約束。否則,保留唯一約束來表示0到多個關係。