Сделать антисимметричный ключ в SQL - PullRequest
1 голос
/ 24 января 2011
ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);

Я хочу, чтобы после создания этого уникального ключа было невозможно добавить B, A.

Например: «Майкл», «Джексон», не позволят вставить позже «Джексон», «Майкл».

Ответы [ 2 ]

1 голос
/ 24 января 2011

Я предполагаю, что ваше приложение имеет дело с чем-то, кроме настоящих имен.(Потому что «Джексон Майкл» является законным именем на английском языке. Так же, как «Джон Дэвид» и «Дэвид Джон».)

Самый простой способ - использовать ограничение CHECK () для обеспечения алфавитного порядка между двумястолбцы.

alter table test
add constraint test_alpha_order
check (a < b);

Но учтите, что у вас могут возникнуть проблемы с чувствительностью к регистру.То есть ваши БД могут полагать, что {'Джексон', 'Майкл'} и {'Джексон', 'Майкл'} являются двумя разными, действительными значениями.Если чувствительность к регистру является проблемой, наиболее распространенным решением, которое я видел, является применение строчных значений, например:

alter table test
add constraint test_alpha_order
check (a = lower(a) and
       b = lower(b) and
       a < b );
0 голосов
/ 24 января 2011

В связи с моим комментарием об отсутствии проверочных ограничений в MySQL, триггер был хорошо известен. Вы должны выполнить следующую проверку как часть триггера BEFORE INSERT ON:

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

но чтобы это привело к сбою, вы должны прибегнуть к MySQL Trickery 1.0 (ранее описанному в TRIGGER, которые вызывают сбой INSERT? Возможно? )

Итак, вам нужно что-то вроде следующего: (проверено)

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;
|

ПРИМЕЧАНИЕ. Я игнорирую регистронезависимость - похоже, ваш вопрос не требует этого.

...