Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何创建此“检查”约束`_Sql_Sql Server - Fatal编程技术网

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的观点很好,应该在尝试回答之前更好地考虑这个问题。