非有向图的唯一约束格式 - 给定(1,2),防止(2,1)

时间:2013-01-08 11:19:54

标签: sql-server sql-server-2008 constraints

我的SQL Server(2008)数据库中有一个非有向图表,我想要一个约束来防止重复。 我的链接表有2列,(City1,City2),都是Cities表中的整数引用。我可以使用以下内容:

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

这是我想要的一半,但这并不妨碍添加“反向”连接。

谷歌向我展示了

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

看起来它会完全符合我的要求,但语法无效。

我也尝试过使用CASE的复杂约束,但我也无法正确使用这种语法。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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
)

编辑 - 经过进一步思考(和评论)后,我同意这不是最好的解决方案