1

Customer、City、Country の 3 つのテーブルがあるとします。

国テーブル:

  • ID(PK)
  • 名前。

都市テーブル:

  • ID(PK)
  • 国 ID (外部キー)
  • 名前

顧客テーブル:

  • ID(PK)
  • 国ID(外字)(NULL)
  • CityID(外字)(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

Country テーブルと City テーブルの両方に FK リレーションシップを設定する

City テーブルを変更して、CountryID、CityID の複合 PK を持つようにします。
その FK 関係は両方を参照する必要があります。

FK は null には適用されません。

1 つの注意点は、その時点でどちらの FK も適用されないため、国が null の不正な CityID を入力できることです。
しかし、それはCHECK CONSTRAINTで強制できると思います。

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