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

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

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

ответ

1

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

Самый простой способ - использовать ограничение 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

+0

Несколько лет назад MySQL был печально известен тем, что утверждал, что он поддерживает иностранные ключевые ограничения. В его документации говорилось что-то вроде «MySQL поддерживает ограничения внешнего ключа. Все внешние ограничения ключа анализируются, а затем игнорируются». Итак, вы правы; так MySQL 5.5 по-прежнему поддерживает ограничения CHECK(). Если вы собираетесь реализовать такое ограничение в MySQL, вам придется написать триггер. И я не уверен, что это сработает, учитывая ограничения MySQL на триггеры и хранимые функции. –

+0

В принципе, вам приходится прибегать к некоторому уровню обмана (заставлять ошибку вместо того, чтобы сигнализировать об этом), но вы можете заставить ее работать. Они все еще утверждают, что вы говорите о ограничениях CHECK (поиск «игнорируется» в http://dev.mysql.com/doc/refman/5.5/en/create-table.html). – kvista

0

В связи с моим комментарием об отсутствии ограничений проверки в MySQL, известным методом обхода было триггер. Вы бы сделать следующую проверку в рамках ДО ВСТАВИТЬ на спусковой крючок:

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

Примечание: я игнорирую случай нечувствительность здесь - ваш вопрос, кажется, не требуют.

 Смежные вопросы

  • Нет связанных вопросов^_^