在你的七种表情中,你有重复例如(playerid1 <> playerid2)
。最终集合限于六个。
我希望有六个不同的约束,每个约束都有一个有意义的名字,以便为用户提供精细的错误消息。
CONSTRAINT playerid2__duplicates__playerid1 CHECK (playerid1 <> playerid2),
CONSTRAINT playerid3__duplicates__playerid1 CHECK (playerid1 <> playerid3),
CONSTRAINT playerid4__duplicates__playerid1 CHECK (playerid1 <> playerid4),
CONSTRAINT playerid3__duplicates__playerid2 CHECK (playerid2 <> playerid3),
CONSTRAINT playerid4__duplicates__playerid2 CHECK (playerid2 <> playerid4),
CONSTRAINT playerid4__duplicates__playerid3 CHECK (playerid3 <> playerid4)
可能会感兴趣的揭示我写上面使用SQL:
WITH T
AS
(
SELECT *
FROM (
VALUES ('playerid1'),
('playerid2'),
('playerid3'),
('playerid4')
) AS T (c)
)
SELECT 'CONSTRAINT '
+ T2.c + '__duplicates__' + T1.c
+ ' CHECK (' + T1.c + ' <> ' + T2.c + '),'
FROM T AS T1, T AS T2
WHERE T1.c < T2.c;
是否有一个共同的列,就像一个游戏ID或东西吗?你总是可以使用'player1 NOT IN(SELECT playerid FROM table WHERE gameid = thisgameid)'(或某种传真) – 2012-03-24 20:25:32
你说'每个表格中最多有4名玩家',但是你想强制检查约束?当playerid为null或0时会发生什么? – dwerner 2012-03-24 20:34:22
@BradChristie,我会试试看,大概'CHECK player1 NOT IN..'会是有效的语法吗? @dwerner,这就是为什么我想澄清关于null == null返回false的情况,在这种情况下,可能会有2名玩家和2个null,并且如果两名玩家不同,它将通过支票。 – c24w 2012-03-24 20:42:01