在你的七種表情中,你有重複例如(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