ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);
Я хочу, чтобы после создания этого уникального ключа добавить B, A невозможно.Сделать антисимметричный ключ в SQL
Например: «Майкл», «Джексон», не разрешит вставлять позже «Джексон», «Майкл».
ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);
Я хочу, чтобы после создания этого уникального ключа добавить B, A невозможно.Сделать антисимметричный ключ в SQL
Например: «Майкл», «Джексон», не разрешит вставлять позже «Джексон», «Майкл».
Я собираюсь предположить, что вы применяете приложения к чему-то помимо настоящих имен. (Так как «Джексон Майкл» является законным именем на английском языке, то есть «Джон Дэвид» и «Дэвид Джон».)
Самый простой способ - использовать ограничение 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, известным методом обхода было триггер. Вы бы сделать следующую проверку в рамках ДО ВСТАВИТЬ на спусковой крючок:
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;
|
Примечание: я игнорирую случай нечувствительность здесь - ваш вопрос, кажется, не требуют.
Я думал, что MySQL не поддерживает ограничения проверки (http://stackoverflow.com/questions/2115497/check-constraint-in-mysql-not-working) – kvista
Несколько лет назад MySQL был печально известен тем, что утверждал, что он поддерживает иностранные ключевые ограничения. В его документации говорилось что-то вроде «MySQL поддерживает ограничения внешнего ключа. Все внешние ограничения ключа анализируются, а затем игнорируются». Итак, вы правы; так MySQL 5.5 по-прежнему поддерживает ограничения CHECK(). Если вы собираетесь реализовать такое ограничение в MySQL, вам придется написать триггер. И я не уверен, что это сработает, учитывая ограничения MySQL на триггеры и хранимые функции. –
В принципе, вам приходится прибегать к некоторому уровню обмана (заставлять ошибку вместо того, чтобы сигнализировать об этом), но вы можете заставить ее работать. Они все еще утверждают, что вы говорите о ограничениях CHECK (поиск «игнорируется» в http://dev.mysql.com/doc/refman/5.5/en/create-table.html). – kvista