在SQL中创建反对称密钥

时间:2011-01-24 12:15:46

标签: sql mysql unique asymmetric

ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);

我希望在创建此唯一键后,无法添加B,A。

例如:“迈克尔”,“杰克逊”,不允许稍后插入“杰克逊”,“迈克尔”。

2 个答案:

答案 0 :(得分: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 );

答案 1 :(得分:0)

与我关于MySQL缺乏检查限制的评论相关,一个众所周知的解决方法就是触发器。您将在BEFORE INSERT ON触发器中执行以下检查:

SELECT COUNT(*) from mytable WHERE b=NEW.a and a=NEW.b

但要使其失败,您必须使用MySQL Trickery 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;
|

注意:我在这里忽略不区分大小写 - 您的问题似乎并不需要。