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