2012-03-15 2 views
0

У меня есть простая таблица с тремя столбцами.mySQL Уникальное ограничение

| prefix | phoneNumber | verifiedDate | 
------------------------------------------ 

verifiedDate мог держать Null

, как я могу заставить это ограничение на моей базе данных? Одна строка для каждого UNIQUE prefx & номер телефона существует если проверено Дате не NULL.

дублирование prefx & PHONENUMBER разрешается только при наличии нет строки, которые держат prefx & PHONENUMBER и verifiedDate не NULL!

+0

Было бы так просто с другими СУБД, но MySQL не поддерживает частичные индексы. –

ответ

0

Единственный способ, которым я это знаю, - использовать SQL Triggers.

Вот некоторые хорошие ресурсы для MySQL именно:

+0

Я попробовал это, но я думаю, что у меня есть ошибка синтаксиса CREATE TRIGGER upd_check ПОСЛЕ ОБНОВЛЕНИЯ НА \t номера телефонов Удалить из '' phonenumbers' WHERE prefix' = new.prefix И 'phoneNumber' = new.phoneNumber И' verifiedDate' IS NULL ; – nullException

+0

Обновлен мой ответ новыми ссылками. Похоже, что в mySQL вы должны сказать ... ON [TABLE] ДЛЯ КАЖДОЙ РУКИ [триггер]. В противном случае это нормально –

+0

# 1442 - Невозможно обновить таблицы «phonenumbers» в хранимой функции/триггере, поскольку она уже используется оператором, который вызывал эту хранимую функцию/триггер. – nullException

0

Общая идея заключается в том, чтобы написать запрос, который возвращает «плохой data ", то в триггерном тесте, что этот запрос является пустым множеством, например что-то вроде

DECLARE unique_tally INT; 
SET unique_tally = 0; 

SELECT COUNT(*) 
    INTO unique_tally 
    FROM (
     SELECT prefix, phoneNumber, COUNT(*) AS tally 
      FROM SimpleTable 
     WHERE verifiedDate IS NOT NULL 
     GROUP 
      BY prefix, phoneNumber 
     ) AS DT1 
WHERE tally > 1; 

IF (unique_tally > 0) THEN 
    -- Fail 
Смежные вопросы