我有一个名为city的表,还有一个名为city_city的表。 city_city关联两个城市记录,因此它有一个fromcity_id和一个tocity_id。我可以通过唯一键强制执行fromcity_id和tocity_id的唯一性,但如何强制执行唯一性,以便在fromcity_id和tocity_id被反转时无法插入记录。
例如,以下记录在概念上是相同的:
id fromcity_id tocity_id
1 100 200
2 200 100
答案 0 :(得分:1)
这将需要一个触发器,因为您需要检查其他行。另外,您可以在应用程序层执行此操作。
答案 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)
问题是这是否比在每个插入上选择表的触发器具有更多,更少或大致相同的开销。答案是分析和测试您的工作负载,数据量和吞吐量。
答案 2 :(得分:0)
添加一个强制执行的检查约束(fromcity_id< tocity_id)并且你已全部设置