2011-01-24 92 views
1
ALTER TABLE `test` ADD UNIQUE (
`a` , 
`b` 
); 

我想在創建此唯一密鑰後,不能添加B,A。在SQL中製作反對稱密鑰

例如:「Michael」,「Jackson」,將不允許稍後插入「Jackson」,「Michael」。

回答

1

我打算假設你是除真名以外的應用程序交易。 (因爲「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); 
+0

我想的MySQL不支持檢查約束(http://stackoverflow.com/questions/2115497/check-constraint-in-mysql-not-working) – kvista 2011-01-24 12:49:19

0

與我對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; 
| 

注:我在這裏忽略不區分大小寫 - 你的問題似乎並沒有要求。