我知道如何创建一对一关系唯一的问题是它需要两个表中的行,例如我有一个表
emp_table => key1, key2, name, description
emp_address_table => key1, key2, address
系统不对地址施加强制性限制,因此雇员可能在没有他/她的地址的情况下存在,或者雇员可能有最多一个地址,而不是看起来更多
1:1(0) 关系
请让我知道如何在 sql server 2008 中做到这一点
我知道如何创建一对一关系唯一的问题是它需要两个表中的行,例如我有一个表
emp_table => key1, key2, name, description
emp_address_table => key1, key2, address
系统不对地址施加强制性限制,因此雇员可能在没有他/她的地址的情况下存在,或者雇员可能有最多一个地址,而不是看起来更多
1:1(0) 关系
请让我知道如何在 sql server 2008 中做到这一点
您不能有一个强制存在子行的约束,因为您不能同时插入两行。即,无论您是先插入员工还是员工地址行,此时您都会有一个无效的约束。
所以 SQL 中的所有约束都是“0 或更多”,而不是“1 或更多”或“正好 1”。
UNIQUE
您可以通过向表中的外键列添加约束来强制执行“0 或 1”约束emp_address
。这将确保最多可以有emp_address
一行引用给定的员工。
使用关联表。无论如何,这是更好的做法,您也可以使用它轻松实现 0 到 N 关系,其中:
* emp_table*
key1
key2
name
description
*地址表*
addr_key
address
* emp_address_table*
key1
key2
addr_key
在您的关联表中,将key1
外key2
键引用返回到您的员工表,并将addr_key
外键引用返回到地址表。如果要强制执行 1 对 1 关系,key1, key2
请对关联表进行唯一约束。否则,保留唯一约束以表示 0 对多关系。
尝试
SELECT *
FROM emp_table et
LEFT OUTER JOIN emp_address_table edt ON et.key1 = edt.key1 AND et.key2 = edt.key2
您不能通过使用约束来强制在子表中有行。(因为您首先在父表中插入行,然后才在子表中插入 - 它不是一个操作而是 2 个,即使它很可能是一个事务)
但是您可以使用存储过程来插入数据,并且可以在过程中进行验证。