【问题标题】:Query that allow duplicate values in a table but not for same foreign key reference允许表中重复值但不允许相同外键引用的查询
【发布时间】:2011-07-07 03:12:51
【问题描述】:

我正在使用带有 asp.net 的 SQL Server2005。我希望在服务器端进行验证以限制重复条目,这里我使用两个表公司和分支机构。在分支表中,我维护了 CompanyId 的外键。在分支机构中,BranchName 可以重复,但特定 CompanyId 不能重复。

Companies Table:
        Columns: CompanyId (Primary Key), CompanyName

Branches Table :
        Columns: BranchId(Primary Key), BranchName, CompanyId (Foreign Key).

公司 ID 可以重复多次,一对多关系。 我使用哪个查询允许重复但不允许相同的 CompanyId?

【问题讨论】:

    标签: asp.net sql-server sql-server-2005 tsql


    【解决方案1】:

    您需要一个对 CompanyID 和 BranchName 列强制唯一性的约束。这可以通过表的主键(如 Tim 推荐的那样)或 UNIQUE 约束:

    ALTER TABLE Branches ADD
        CONSTRAINT UQ_BranchNamesWithinCompanies UNIQUE (BranchName,CompanyID);
    

    您可以根据基于两列在表中执行搜索的频率来决定将列放在约束中的顺序。 IE。您实际上是在这些列上创建索引,因此您不妨使用它来提高一些查询性能。

    上述排序是基于您可能会在不参考特定公司的情况下搜索分公司名称的猜测。如果您总是在公司内部进行搜索,并且正在执行前缀搜索(例如 CompanyID=21 and BranchName like 'Lon%'),那么您可能希望反转列的顺序。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 公司ID可以重复多次。
      • @Ritu:是的,你的问题是......??您可以使用具有独特约束的 Damiens 解决方案或我的具有复合主键的解决方案。两者都将避免重复(相同 CompanyID 的相同 BranchName)。您现在的问题是如何查询数据库中已经存在给定的组合?您可以尝试插入它并捕获约束异常,这是最简单的方法,也可以编写一个查询,在插入之前查看表(较慢)。
      • 其实我的条件是一家公司可能有多个分公司,但是对于同一家公司应该是同一个分公司,而对于不同的公司,分公司可以是相同的(例如有2个)像A和B这样的公司和像x和y这样的分支名称。这里我想说A的分支名称可以是x和y,但是x不能对A重复,而对B重复。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多