2013-03-08 2 views
6

Предположим, у меня есть таблица, где я хочу, чтобы значения MY_COLUMN были уникальными, за исключением случаев, когда значение «xyz». Другими словами, MY_COLUMN может быть «xyz» в нескольких строках, но все значения, которые не являются «xyz», должны быть уникальными. Можно ли установить ограничение, которое достигает этого?Возможно ли иметь ограничение MySQL, требующее, чтобы столбец был уникальным *, если он не равен определенному значению?

+2

Не специалист в 'mysql', но я считаю,' null' единственное значение, которое работает таким образом - то есть все значения в ограничении уникальности должен быть уникальным или 'null'. –

+1

Для включения и перед обновлением потребуется триггер. Звучит как очень запутанная вещь для вашего будущего себя, чтобы отлаживать. Обязательно задокументируйте это полностью. –

+0

Поскольку MySQL не поддерживает частичный индекс (в отличие от большинства других СУБД), нет, я не думаю, что это легко возможно –

ответ

3

Согласно documentation

уникальный индекс создает ограничение таким образом, что все значения в индексе должны быть различными. Произошла ошибка, если вы попытаетесь добавить новую строку с ключом , который соответствует существующей строке. Для всех двигателей индекс UNIQUE допускает множество значений NULL для столбцов, которые могут содержать NULL.

Итак, создайте столбец с нулевым значением, и когда вы запрашиваете свою таблицу, просто используйте ISNULL(MY_COLUMN, 'xyz').

0

Вы не можете установить ограничение, чтобы сделать это, однако, если вы делаете это внутри позволяет говорить ява проект, вы можете сделать что-то вроде

If (MY_COLUMN != "xyz"){ 
    Get records of table with "xyz" in it 
    X = //maping would equal "Select MY_COLUMN from table" (or select * from table depending on your mapping 

Затем проверьте, чтобы увидеть, если какой-либо матч, и, наконец, если они этого не делают, запустите инструкцию insert. Если вы делаете этот фрилансер, может быть, еще один столбец, который является просто bool, чтобы сказать, если это правда, тогда MY_COLUMN = 'xyz' еще посмотрим на MY_COLUMN и получите val. Это сложно.

0

Подумав об этом, я думаю, что предоставлю свой ввод.

Как было правильно указано другими ответами, MySQL не может иметь индекс UNIQUE, который имеет дублирование.

Я не буду обсуждать тот факт, что это не может быть связано с путаницей, и если вы «должны» сделать что-то подобное.

Вы можете добиться того, что, по моему мнению, получат одинаковые результаты, указав правильный индекс на my_column, но также установите значение NOT NULL (это важно, так как без этого триггер не будет вызывать ошибку для повторяющихся индексов). Вы можете создать триггер для my_table следующим образом:

CREATE TRIGGER my_table_unique_index_with_exception BEFORE INSERT ON my_table 
FOR EACH ROW BEGIN 
    IF NEW.my_column != 'xyz' THEN 
    -- The value isn't 'xyz' so only one instance of this value is allowed 
    -- check the count and if the value exists set it to NULL which will thorw 
    -- an error as my_column annot be NULL 
    IF (SELECT COUNT(*) FROM my_table WHERE my_table.my_row = NEW.my_column) > 0 THEN 
     SET NEW.my_column = NULL; 
    END IF; 
END