SQL字段约束

3
我有下面的表格,需要添加某种约束条件,使客户只能拥有一个供应商分销商。因此,如果您尝试将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

这是否可以通过某种唯一约束来实现?


1
你需要在这两列上设置一个唯一键。 - shadow
2个回答

5

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/zh-cn/library/ms187019(v=sql.120).aspx

了解唯一约束:http://www.w3school.com.cn/sql/sql_unique.asp

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


应该在“ProductDistribution”字段上创建索引,因为该字段将被更新为true或false? - user3266033
不,你只需要包含需要唯一的列。在你的情况下,ClientID和SupplierID的组合必须是唯一的。你不必担心包含值的列。 - Raul
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - P.Salmon

1

这也可以工作

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接