我有一个客户表,该表通过中间的CustomerAddress表链接到地址表。这意味着一个客户可以有很多地址,而一个地址可以有很多客户。 (这是必要的,因为我们将配偶和子女作为单独的客户来对待,并且每个人都可以有送货,工作,账单和其他地址)。

我希望客户能够指定首选地址。

我的想法是在客户表中创建一个新列,该列链接到一个CustomerAddress记录。

我的问题是-如何确保所选的首选地址是该客户的地址之一?

我的想法是将Check约束放在customer.preferredAddress字段上,该字段检查给定的CustomerAddress以查看记录的客户ID是否与正在更新的客户匹配。

这可能吗?我只用过Check约束来检查简单的东西,例如(Value> 0)等。

谢谢你的帮助

最佳答案

编写用于验证地址所有权的UDF,然后从检查约束中引用该UDF。

CREATE FUNCTION dbo.fnIsAddressOwner (
  @CustomerId int,
  @AddressId int
)
RETURNS tinyint
AS
BEGIN
  DECLARE @Result tinyint
  IF EXISTS(SELECT * FROM CustomerAddresses WHERE CustomerId=@CustomerId and AddressId=@AddressId)
    SET @Result= 1
  ELSE
    SET @Result= 0
  RETURN @Result
END


CREATE TABLE Customers (
  CustomerId int,
  PreferredAddressId int,
  CONSTRAINT ckPreferredAddressId CHECK (
    dbo.fnIsAddressOwner(CustomerId, PreferredAddressId) = 1)
  )
)

关于sql - 复杂的检查约束?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21999707/

10-16 23:05