2010-07-21 2 views
4

У меня есть таблица пользователя в моей БД.Уникальное ограничение с условием MYSQL

Пользователь имеет имя поля, company_id и статус: boolean, 1- live, 0- deleted.

Когда пользователь будет удален, его статус устанавливаются в 0.

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

Мой вопрос, как я определяю uniuqe ограничить для названия полей, company_id и статус = 1 (Это не uniuqe Constrain на те три поля потому что я не против того, что сочетание имени-company_id- 0 будет отображаться несколько раз в таблице).

Спасибо,

Двора

ответ

3

значение использования NULL для удаленных пользователей.
Уникальный ключ позволяет неограниченное количество значений NULL.

Обновление: не прикасайтесь к имени пользователя, достаточно NULL в поле состояния.

+0

Вид мухи в лице цели NULL (неизвестно или не применимо), но это прагматично (и я все для прагматизма). – paxdiablo

1

Какой язык программирования вы используете?

логик Shoule быть следующим

select * from Table_name where name='' AND company_id = '' AND status = 1 

if this return any rows give uniqueness error to the user else create it. 
0

Я бы создать другой столбец для хранения предыдущего имени удаленного пользователя и установить их реальное имя NULL, когда они удаляются (а также установки статуса до 0).

Тогда у вас есть уникальное ограничение на имя и компанию. NULL не повлияют на уникальность (начиная с NULL != NULL), и вы можете восстановить исходное имя пользователя, если хотите.

Так что операция удаления нечто вроде:

update users 
    set prev_name = name, 
     name = null, 
     status = 0 
where name = 'paxdiablo' and company = 'SmallGreen'; 
+0

Спасибо всем! – Dvora

0

было бы проще, если вы разделяете «живой» и «удаленные», так у них есть свои собственные TinyInt/логические столбцы?

-1

Я бы заменил поле состояния с помощью deleted_at (datetime). Когда пользователь активен, его значение будет NULL, но при удалении оно будет установлено на текущее время и время.

Далее я бы добавил уникальный индекс для имени пользователя & deleted_at, что позволит мне удалить более одного пользователя с тем же именем пользователя (не менее 1 секунды).

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