假设我们有三张表 Customer、City 和 Country
国家表:
- 身份证(PK)
- 姓名。
城市表:
- 身份证(PK)
- 国家 ID (FK)
- 姓名
客户表:
- 身份证(PK)
- 国家 ID(FK)(NULL)
- CityID(FK)(NULL)
- 姓名等...
正如您可以猜到的那样,客户可能已分配或未分配 CityID 或 CountryID。
那么,确保在插入/更新客户时我们不会得到一个不在指定国家/地区的城市的最佳方法是什么?
假设我们有三张表 Customer、City 和 Country
国家表:
城市表:
客户表:
正如您可以猜到的那样,客户可能已分配或未分配 CityID 或 CountryID。
那么,确保在插入/更新客户时我们不会得到一个不在指定国家/地区的城市的最佳方法是什么?
我不确定这是否是最好的方法,但您可以添加一个函数并在您的检查约束中使用它:
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
将 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)