Sql 如何创建此“检查”约束`
我有两张桌子:Sql 如何创建此“检查”约束`,sql,sql-server,Sql,Sql Server,我有两张桌子: 人: Id | OrgId | Name ----------------- 1 10 Sam 2 10 Dana 3 12 Max alter table people add constraint unq_people_orgid_id unique (orgid, id); Id是主键OrgId是其他表的外键 和第二个表车辆: Id | Name | OrgId | PersonId ---------------
人
:
Id | OrgId | Name
-----------------
1 10 Sam
2 10 Dana
3 12 Max
alter table people add constraint unq_people_orgid_id unique (orgid, id);
Id
是主键OrgId
是其他表的外键
和第二个表车辆:
Id | Name | OrgId | PersonId
----------------------------
1 Volvo 10 1
2 BMW 10 2
alter table cars add constraint
foreign key (orgid, personid) references people(orgid, id);
此处:Id
是主键PersonId
是People
表的外键OrgId
是组织
表的外键
因此,我有个人
附属于组织
,我有汽车
附属于组织
和个人
我需要保证,将无法从一个组织
将汽车
连接到另一个组织
的人员
。记录如下:
Id | Name | OrgId | PersonId
----------------------------
1 Volvo 12 1
必须是不可能的,因为Car
属于ID
=12的组织
,而Person
属于组织
ID
=10
最好的方法是什么
我认为有两种方式:
使用两个字段的外键People
(Id
OrgId
)Cars
(PersonId
+OrgId
)
但是在这种情况下,我需要在表People
('Id+
OrgId')上创建一个额外的唯一索引
Cars
李>
在这种情况下,您建议使用什么?我不会在您的cars表中使用OrgId,它违反了规范化规则。您可以使用PersonId查询汽车的组织信息。我不会在您的汽车表中使用OrgId,它违反了规范化规则。您可以使用PersonId查询汽车的组织信息。我的第一反应是使用person列查找组织。但是,这并不符合实际情况——汽车由独立于人的组织拥有。因此,您可能需要组织,即使没有分配人员 因此,请为
人员添加一个新密钥
:
Id | OrgId | Name
-----------------
1 10 Sam
2 10 Dana
3 12 Max
alter table people add constraint unq_people_orgid_id unique (orgid, id);
然后将其用于车辆中的外键参考:
Id | Name | OrgId | PersonId
----------------------------
1 Volvo 10 1
2 BMW 10 2
alter table cars add constraint
foreign key (orgid, personid) references people(orgid, id);
请注意,第二个键是多余的。但是它允许包含组织的引用。我的第一反应是使用person列查找组织。但是,这并不符合实际情况——汽车由独立于人的组织拥有。因此,您可能需要组织,即使没有分配人员
因此,请为人员添加一个新密钥
:
Id | OrgId | Name
-----------------
1 10 Sam
2 10 Dana
3 12 Max
alter table people add constraint unq_people_orgid_id unique (orgid, id);
然后将其用于车辆中的外键参考:
Id | Name | OrgId | PersonId
----------------------------
1 Volvo 10 1
2 BMW 10 2
alter table cars add constraint
foreign key (orgid, personid) references people(orgid, id);
请注意,第二个键是多余的。但它允许包含组织的引用。我会选择第一个选项。这是一个常见问题解答,如果你在搜索中真正表达了你在做什么,你和所有其他提问者都会找到答案。Google my comments在Google上搜索你问题的多个版本。我会选择第一个选项。这是一个常见问题解答,如果你在搜索中真正表达了你在做什么,你和所有其他提问者都会找到答案。Google my comments在Google上搜索您问题的许多版本。汽车
可以在PersonId
列中有NULL
值(该汽车没有驾驶员),但该汽车
在OrgId
列中仍然有值(因为该汽车属于该组织)。所以我看不到这里的非规范化。@demas很好的一点是,在尝试回答之前应该更好地考虑这一点。Car
可以在PersonId
列中有NULL
值(该车没有司机),但该Car
在OrgId
列中仍然有值(因为该车属于该组织)。所以我看不到这里的非规范化。@demas的观点很好,应该在尝试回答之前更好地考虑这个问题。