2016-02-16 3 views
1

Я хочу иметь таблицу БД, которая будет иметь (среди других дополнительных полей):частичная уникальность индекса

int id 
int group_id 
varchar(20) code 
int code_status 

коды генерируются случайным образом, и я хотел бы обеспечивать уникальность group_id + кода в пределах область действия конкретного кода_стату (например, 0). т. Е. Иметь group_id+code where codes_staus=0 быть уникальным. так, что, например, это o.k. иметь:

id,group_id,code,code_status 
1,1,1,0 
2,1,2,0 

потому что коды уникальны. он также должен быть o.k. иметь:

1,1,1,1 
2,1,1,1 
3,1,1,0 

потому что даже если группа + код не является уникальной ее o.k. пока статус не равен 0.

Но имея

1,1,1,0 
1,1,1,0 

не должно быть разрешено.

Могу ли я использовать какую-либо форму индексов, чтобы заставить этот тип частичной уникальности? или я должен просто искать group_id + код + 0 перед любой новой вставкой?

Мне нужно это, чтобы работать с MySQL, но также оценил бы решения, которые работают с другими БД только с целью расширения моих знаний.

+0

Также рассмотрите «TRIGGER» и «INSERT .. ON DUPLICATE KEY UPDATE». –

ответ

1

Я действительно не думаю, что это можно решить с помощью индексов. Вы не можете поместить индекс только для некоторых значений столбца.

Но вы можете решить только с MySQL:

INSERT INTO your_table (group_id,code,code_status) 
    SELECT 1, 2, 0 
    FROM dual 
    WHERE NOT EXISTS (
     SELECT * 
     FROM your_table 
     WHERE group_id = 1 AND code= 2 AND code_status = 0 
    ) 

И вам также может понадобиться, чтобы сделать это для UPDATE.


ИЛИ

Есть две таблицы. Один для code_status = 0 (где вы сможете разместить свой уникальный индекс) и один для другого, и создать представление, чтобы объединить их.

table_1 
----------------- 
int id 
int group_id 
varchar(20) code 

table_2 
----------------- 
int id 
int group_id 
varchar(20) code 
int code_status 

И вид

CREATE VIEW all_codes AS 
SELECT id, group_id, code, 0 AS code_status FROM table_1 
UNION SELECT * FROM table_2 

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

+0

Спасибо Алину, я не думаю, что могу использовать второй метод, потому что он слишком усложняет смену status_code. Мне нужно будет рассмотреть первый вариант и посмотреть, могу ли я указать, была ли добавлена ​​новая строка или нет (я думаю, я должен был бы сказать на основе итогового rowCount). – epeleg

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