1

假设我们有三张表 Customer、City 和 Country

国家表:

  • 身份证(PK)
  • 姓名。

城市表:

  • 身份证(PK)
  • 国家 ID (FK)
  • 姓名

客户表:

  • 身份证(PK)
  • 国家 ID(FK)(NULL)
  • CityID(FK)(NULL)
  • 姓名等...

正如您可以猜到的那样,客户可能已分配或未分配 CityID 或 CountryID。

那么,确保在插入/更新客户时我们不会得到一个不在指定国家/地区的城市的最佳方法是什么?

4

2 回答 2

1

我不确定这是否是最好的方法,但您可以添加一个函数并在您的检查约束中使用它:

CREATE FUNCTION CheckCityInCountry(@CityID int, @CountryID int)
RETURNS int
AS 
BEGIN
   DECLARE @retval int
   SELECT @retval = COUNT(*) 
     FROM Cityies CI inner join Countries CO on (CI.CountryID, CO.ID)
     WHERE CO.CountryID = @CountryID and CityID = @CityID
   RETURN @retval
END;
GO

如果城市在某个国家/地区,此函数将返回 1,否则返回 0。

然后使用该函数添加检查约束:

ALTER TABLE Customers
ADD CONSTRAINT chk_CheckCityInCountry CHECK (
   CityID is null OR
   dbo.CheckCityInCountry(CityID,CountryID) >= 1
);
GO
于 2013-03-09T12:41:32.233 回答
0

将 FK 关系设置为 Country 和 City 表

将 City 表更改为具有 CountryID、CityID 的复合 PK。
FK 关系必须同时引用两者。

FK 不强制为 null。

需要注意的是,您可以输入带有空国家/地区的错误 CityID,因为此时没有强制执行 FK。
但我认为这可以通过检查约束来强制执行。

ALTER TABLE dbo.CustomerCountyCity ADD CONSTRAINT CK_CustomerCountyCity
    CHECK (CountryID is not null OR CityID is Null)
于 2013-03-09T14:39:00.003 回答