1

SQL Server (2008) データベースに無向グラフ テーブルがあり、重複を防ぐための制約が必要です。リンク テーブルには 2 つの列 (City1、City2) があり、どちらも Cities テーブルへの整数参照です。以下を使用できます。

ALTER TABLE dbo.CityConnections
ADD CONSTRAINT CK_CityConnections_OneWayOnly UNIQUE (City1, City2)

これは私が望むことの半分ですが、これは「逆」接続の追加を妨げません。

Google が教えてくれた

... UNIQUE (MIN(City1,City2), MAX(City1,City2))

それはまさに私が望むことをするように見えますが、構文は無効です。

CASE を使用して複雑な制約も試しましたが、この構文も正しくできませんでした。

どうすればこれを達成できますか?

4

2 に答える 2

4

テーブルへのエントリを制御できると仮定すると、次のように動作するはずです。

ALTER TABLE dbo.CityConnections
ADD CONSTRAINT CK_CityConnections_Unq UNIQUE (City1, City2)
ALTER TABLE dbo.CityConnections
ADD CONSTRAINT CK_CityConnections_OneWayOnly CHECK (City1 < City2)
于 2013-01-08T11:26:53.150 に答える
0

長年頭を悩ませていた質問をするとすぐに、インスピレーションを得て自分で解決できます。私の解決策は、計算された列を追加し、それらを一意の制約 (インデックス) として使用することでした

私は今持っています:

CREATE TABLE [CityConnections]
(
    [City1] [int] NOT NULL,
    [City2] [int] NOT NULL,
    [minCity]  AS (case when [City1]<[City2] then [City1] else [City2] end),
    [maxCity]  AS (case when [City1]>[City2] then [City1] else [City2] end),
CONSTRAINT [CK_CityConnections_OneWayOnly] UNIQUE NONCLUSTERED 
(
    [minCity] ASC,
    [maxCity] ASC
)

編集 - さらに考えた後 (およびコメント)、これが最善の解決策ではないことに同意します

于 2013-01-08T11:44:04.693 に答える