ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);
我想在創建此唯一密鑰後,不能添加B,A。在SQL中製作反對稱密鑰
例如:「Michael」,「Jackson」,將不允許稍後插入「Jackson」,「Michael」。
ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);
我想在創建此唯一密鑰後,不能添加B,A。在SQL中製作反對稱密鑰
例如:「Michael」,「Jackson」,將不允許稍後插入「Jackson」,「Michael」。
我打算假設你是除真名以外的應用程序交易。 (因爲「Jackson Michael」是英文的合法名稱,「John David」和「David John」也是如此)。
最簡單的方法是使用CHECK()約束來強制兩列之間的字母順序。
alter table test
add constraint test_alpha_order
check (a < b);
但請注意,您也可能遇到區分大小寫的問題。也就是說,你的dbms可能會認爲{'Jackson','Michael'}和{'jackson','michael'}是兩個不同的有效值。如果區分大小寫是一個問題,我所見過的最常見的解決方案就是像這樣強制執行小寫值。
alter table test
add constraint test_alpha_order
check (a = lower(a) and
b = lower(b) and
a < b);
與我對MySQL缺少檢查約束的評論相關,衆所周知的解決方法一直是觸發器。你會做下列檢查作爲BEFORE INSERT觸發器的一部分:
SELECT COUNT(*) from mytable WHERE b=NEW.a and a=NEW.b
,但讓這個導致失敗,你不得不求助於MySQL的詭計1.0(以前在TRIGGERs that cause INSERTs to fail? Possible?描述)
所以,你需要像下面這樣:(測試)
delimiter |
CREATE TRIGGER t1
BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
set @x = (SELECT COUNT(*) FROM mytable WHERE b=NEW.a and a=NEW.b);
IF (@x > 0) THEN
set @y = (SELECT noSuchField FROM mytable);
END IF;
END;
|
注:我在這裏忽略不區分大小寫 - 你的問題似乎並沒有要求。
我想的MySQL不支持檢查約束(http://stackoverflow.com/questions/2115497/check-constraint-in-mysql-not-working) – kvista 2011-01-24 12:49:19