0

我知道如何创建一对一关系唯一的问题是它需要两个表中的行,例如我有一个表

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

系统不对地址施加强制性限制,因此雇员可能在没有他/她的地址的情况下存在,或者雇员可能有最多一个地址,而不是看起来更多

1:1(0) 关系

请让我知道如何在 sql server 2008 中做到这一点

4

4 回答 4

2

您不能有一个强制存在子行的约束,因为您不能同时插入两行。即,无论您是先插入员工还是员工地址行,此时您都会有一个无效的约束。

所以 SQL 中的所有约束都是“0 或更多”,而不是“1 或更多”或“正好 1”。

UNIQUE您可以通过向表中的外键列添加约束来强制执行“0 或 1”约束emp_address。这将确保最多可以有emp_address一行引用给定的员工。

于 2012-05-14T11:04:09.157 回答
1

使用关联表。无论如何,这是更好的做法,您也可以使用它轻松实现 0 到 N 关系,其中:

  • 关联表中没有行代表 0:0
  • 每个实体在关联表中存在单行表示 1 比 1
  • 关联表中存在多行(每个实体)表示 1 到多个

* emp_table*

key1
key2
name
description

*地址表*

addr_key
address

* emp_address_table*

key1
key2
addr_key

在您的关联表中,将key1key2键引用返回到您的员工表,并将addr_key外键引用返回到地址表。如果要强制执行 1 对 1 关系,key1, key2请对关联表进行唯一约束。否则,保留唯一约束以表示 0 对多关系。

于 2012-05-14T11:11:03.547 回答
0

尝试

SELECT * 
FROM emp_table et 
LEFT OUTER JOIN emp_address_table edt ON et.key1 = edt.key1 AND et.key2 = edt.key2
于 2012-05-14T11:05:35.987 回答
0

您不能通过使用约束来强制在子表中有行。(因为您首先在父表中插入行,然后才在子表中插入 - 它不是一个操作而是 2 个,即使它很可能是一个事务)

但是您可以使用存储过程来插入数据,并且可以在过程中进行验证。

于 2012-05-14T11:08:27.697 回答