【问题标题】:SQL field constraintSQL 字段约束
【发布时间】:2016-05-18 10:00:49
【问题描述】:

我有下表,需要某种约束,只允许客户只有一个供应商分销商。因此,如果您尝试将 SupplierClientID 记录“2”的 ProductDistribution 字段更改为 true,它将无法正常工作,因为该客户端 (847) 已为 SupplierID 10 启用。

供应商表

SupplierClientID  ClientID  SupplierID  ProductDistribution
1                 847         10        1
2                 847         11        0
3                 800         10        1
4                 800         11        0
5                 800         12        0
6                 570         11        1
7                 570         12        0

这是否可能通过某种独特的约束?

【问题讨论】:

  • 两列需要唯一键。

标签: sql-server constraints


【解决方案1】:

SQL Server 提供唯一索引。

以下索引仅允许客户和供应商的独特组合:

CREATE UNIQUE NONCLUSTERED INDEX NCUIX_Suplier_ClientSupplier
   ON dbo.Supplier (ClientID , SupplierID); 
GO

要让一个客户只有一次 ProductDistribution 为 1,您需要另一个索引:

CREATE UNIQUE NONCLUSTERED INDEX NCUIX_Suplier_ClientActiveDistribution
   ON dbo.Suplier (ClientID) WHERE ProductDistribution = 1 ; 
GO

如果您不想为约束设置索引,这里有一个更广泛的方法,使用带有函数的检查约束:

CREATE FUNCTION CountClientProductDistributions(@ClientID INT)
RETURNS INT
AS 
BEGIN
   RETURN (SELECT COUNT(1) FROM dbo.Suplier WHERE ClientID = @ClientID AND ProductDistribution = 1)
END
GO

ALTER TABLE dbo.Suplier
ADD CONSTRAINT Suplier_CheckClientProductDistribution CHECK (dbo.CountClientProductDistributions(ClientID) <= 1);
GO

了解唯一索引:https://msdn.microsoft.com/en-us/library/ms187019(v=sql.120).aspx

阅读有关独特约束的信息:http://www.w3schools.com/sql/sql_unique.asp

了解检查约束:https://msdn.microsoft.com/en-us/library/ms190377(v=sql.120).aspx

【讨论】:

  • 是否应该在“ProductDistribution”字段上创建索引,因为它将更新为 true 或 false?
  • 不,您只需包含需要唯一的列。在您的情况下,ClientID 和 SupplierID 的组合必须是唯一的。您不必担心包含值的列。
  • 这个解决方案似乎没有回答这个问题。鉴于提供的数据,可以 UPDATE SUPPLIER SET ProductDistribution = 1 where SupplierClientID = 2 - 也许我遗漏了什么?
【解决方案2】:

这也有效

 --Create index SupplierClients_ ProductDistribution
Create UNIQUE NONCLUSTERED INDEX NCUIX_Suplier_ClientSupplier
   ON dbo.SupplierClients (ClientID ) WHERE ProductDistribution = 1 ; 
GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多