ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);
我希望在创建此唯一密钥后,无法添加 B、A。
例如:“Michael”、“Jackson”,不允许以后插入“Jackson”、“Michael”。
ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);
我希望在创建此唯一密钥后,无法添加 B、A。
例如:“Michael”、“Jackson”,不允许以后插入“Jackson”、“Michael”。
我将假设您的应用程序处理除真实姓名之外的其他内容。(因为“杰克逊迈克尔”在英语中是一个合法的名字。“约翰大卫”和“大卫约翰”也是如此。)
最简单的方法是使用 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 ON 触发器的一部分,您将执行以下检查:
SELECT COUNT(*) from mytable WHERE b=NEW.a and a=NEW.b
但是要让这个导致失败,你必须求助于 MySQL Trickery 1.0(之前在导致 INSERT 失败的 TRIGGERs 中描述过?可能吗?)
因此,您需要以下内容:(经过测试)
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;
|
注意:我在这里忽略了不区分大小写 - 您的问题似乎不需要。