2015-01-13 2 views
1

У меня есть таблица:SQL уникального constrait с таможенной стоимостью

id emp_id company role 
1 3  1  0 
2 2  1  0 
3 1  1  1 

Мне нужно ограничить добавление 2 сотрудников для компании с role = 1. Как уникальный ключ для компании & роль, но только для role = 1;

Иными словами, INSERT INTO table (emp_id, company, role) (4, 1, 1) должен потерпеть неудачу.

Единственный способ сделать это в моей голове - использовать триггеры. Есть ли другой способ?

+0

Создайте составной ключ с более чем одним столбцом, который позволит решить вашу проблему (нет необходимости использовать триггеры) –

+0

@securedeveloper, но он хочет разрешить создание нескольких строк с 'role = 0'. – benji

+0

« Есть ли еще один путь?" не без рисунка стола, который я могу придумать ... @securedeveloper как? составной ключ на роль компании не позволит компании 1 иметь 2 роли 0 ..., которая разрешена ... 'insert, где не существует (компания с ролью 1), то же самое для обновления ...' но это не применяет ее .. триггер - единственный способ обеспечить его соблюдение без ограничения или сложного ключа без изменения дизайна таблицы. – xQbert

ответ

0

Создать filtered index

create unique index [Indexname] 
on [Yourtable](company,role) 
where [role] = 1 
+1

MySQL не поддерживает частичные индексы – ovnia

+0

ohhh не знал об этом. Сервер Sql имеет эту функцию –

1

Один из способов сделать это в MySQL, чтобы изменить role поэтому она содержит 1 или NULL, а не NULL`s, так что вы можете сделать:

create unique index idx_table_company_role on table(company, role); 

Затем вы можете создать представление на столе, если вы хотите видеть 0 и 1:

create view v_table as 
    select t.*, (case when role = 1 then 1 else 0 end) as newrole 
    from table; 
Смежные вопросы