1

我有一張名爲city的表格和一張名爲city_city的表格。 city_city關聯兩個城市記錄,所以它有一個fromcity_id和一個tocity_id。我可以通過一個唯一的關鍵字強制執行fromcity_id和tocity_id的唯一性,但是如何執行唯一性,以便在fromcity_id和tocity_id顛倒時不能插入記錄。如何在sql server中執行此約束條件

例如,下面的記錄是在概念上是相同的:

id fromcity_id tocity_id 
1  100   200 
2  200   100 

回答

1

這將需要一個觸發,因爲你需要檢查其他行。毫不誇張地說,你可以在應用層做到這一點。

1

另一個選擇是創建一個索引視圖,在視圖上有一個唯一的約束(horrid,但也可以完成這項工作)。該視圖會是這樣的:

CREATE UNIQUE INDEX UIX_vwSomeView ON vwSomeView (C1, C2) 

的問題是,這是否有更多的,更少的,或大致相同的開銷,作爲一個觸發器選擇:

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 

在視圖然後創建唯一索引每個插頁上的表格。對此的回答是針對您的工作負載,數據量和吞吐量進行配置和測試。

0

添加強制檢查約束(fromcity_id < tocity_id)並且您全部設置爲