如何创建这个`check constraint`

时间:2018-02-02 18:54:45

标签: sql sql-server

我有两张桌子:

People

Id | OrgId | Name
-----------------
 1    10      Sam
 2    10      Dana
 3    12      Max

Id是主键。 OrgId是其他表的外键。

第二张表Cars

Id | Name | OrgId | PersonId 
----------------------------
1    Volvo   10        1
2    BMW     10        2

此处:Id是主键。 PersonIdPeople表的外键。 OrgIdOrganization表的外键。

所以我Person已附加到OrganizationCars附加到OrganizationPerson

我需要保证无法将CarOrganization附加到Person而从另一个Organization附加Id | Name | OrgId | PersonId ---------------------------- 1 Volvo 12 1 。记录:

Car

必须是不可能的,因为Organization属于IDPerson = 12,但Organization属于IDPeople = 10。

最好的方法是什么?

我看到两种方式:

  1. 使用两个字段的外键IdOrgId + Cars)< - > PersonIdOrgId + People)。
  2. 但在这种情况下,我需要在表+上创建一个额外的唯一索引(' Id Cars OrgId`)。

    1. 触发表class Functor (f :: * -> *) where fmap :: (a -> b) -> f a -> f b
    2. 在这种情况下,您建议使用什么?

2 个答案:

答案 0 :(得分:2)

我的第一反应是使用person列查找组织。但是,这并不适合这种情况 - 汽车是由独立于人的组织所拥有的。因此,即使没有人员,也可能需要组织。

因此,请向people添加新密钥:

alter table people add constraint unq_people_orgid_id unique (orgid, id);

然后将其用于cars中的外键引用:

alter table cars add constraint
    foreign key (orgid, personid) references people(orgid, id);

请注意,第二个密钥 是多余的。但它允许包含组织的参考。

答案 1 :(得分:0)

我不会在你的汽车表中使用OrgId,它违反了规范化规则。您可以使用查询来使用PersonId获取汽车的组织信息。