1

cityというテーブルとcity_cityというテーブルがあります。city_cityは2つの都市レコードを相関させるため、fromcity_idとtocity_idがあります。fromcity_idとtocity_idに一意性キーを使用して一意性を適用できますが、fromcity_idとtocity_idが逆になっている場合にレコードを挿入できないように、一意性を強制するにはどうすればよいですか。

たとえば、次のレコードは概念的に同じです。

id    fromcity_id  tocity_id
1     100          200
2     200          100
4

3 に答える 3

1

もう1つのオプションは、ビューに一意の制約を設定してインデックス付きビューを作成することです(恐ろしいですが、その役割も果たします)。ビューは次のようになります。

CREATE VIEW vwSomeView WITH SCHEMABINDING
AS
    SELECT fromcity_id AS 'C1', tocity_id AS 'C2' FROM city_city
    UNION ALL
    SELECT tocity_id AS 'C1', fromcity_id AS 'C2' FROM city_city

次に、ビューに一意のインデックスを作成します。

CREATE UNIQUE INDEX UIX_vwSomeView ON vwSomeView (C1, C2)

問題は、これが各挿入でテーブルを選択するトリガーと同じオーバーヘッドであるか、少ないか、またはほぼ同じであるかどうかです。これに対する答えは、ワークロード、データボリューム、およびスループットをプロファイリングしてテストすることです。

于 2010-04-21T21:02:05.250 に答える
1

他の行を調べる必要があるため、これにはトリガーが必要です。または、アプリケーション層でこれを行うこともできます。

于 2010-04-21T16:01:30.433 に答える
0

(fromcity_id <tocity_id)を強制するチェック制約を追加すると、すべて設定されます

于 2010-04-21T21:37:22.910 に答える