Есть таблица из N полей.
На хранение данных в таблице должно быть наложено следующее ограничение:
Не должно существовать двух записей, у которых есть частичное пересечение по заполненности полей, т.е. должно быть либо полное пересечение, либо пустое множество пересечений.
Поясню на примере. Есть таблица с полями A, B, C, D
Не должно существовать таких строк:
A=1, B=NULL, C=NULL, D=NULL
A=1, B=1, C=NULL, D=NULL
Могут существовать такие строки:
A=1, B=NULL, C=NULL, D=NULL
A=NULL, B=1, C=2, D=NULL
A=NULL, B=NULL, C=NULL, D=1
A=NULL, B=1, C=3, D=NULL
Под 1,2 и т.п. понимается любое значение, отличное от NULL.
Хочется решить эту проблему на уровне сервера. Пока видится в качестве решения только триггер. Но даже там не хочется перечислять все поля во всевозможных сочетаниях. Может кто сталкивался с подобной задачей?
Здравствуйте, Alexan, Вы писали:
A>Не должно существовать таких строк: A> A=1, B=NULL, C=NULL, D=NULL
.......... A>Могут существовать такие строки: A> A=1, B=NULL, C=NULL, D=NULL
........
???
«Национализм во мне столь естественный, что никогда никаким интернационалистам его из меня не вытравить»
Менделеев Д. И.
Здравствуйте, Alexan, Вы писали:
A>Нужно смотреть не отдельно настроки, а на совокупности строк. Наверное, я не очень очевидно написал — подправил исходное сообщение.
Хорошо бы внести и СУБД, лучше с версией.
Если это Oracle — красиво вряд ли получится. Проще сделать процедуру, которая проверяет условие а потом вносит строку (если она подходит) и вставлять|апдейтить только через неё.
«Национализм во мне столь естественный, что никогда никаким интернационалистам его из меня не вытравить»
Менделеев Д. И.
Здравствуйте, Alexan, Вы писали:
A>>>Не должно существовать таких строк: A>>> A=1, B=NULL, C=NULL, D=NULL B>>.......... A>>>Могут существовать такие строки: A>>> A=1, B=NULL, C=NULL, D=NULL B>>........
B>>???
A>Нужно смотреть не отдельно настроки, а на совокупности строк. Наверное, я не очень очевидно написал — подправил исходное сообщение.
Чего то не пойму я с двух стаканов — выше указанная пара допустима или нет?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, Alexan, Вы писали:
A>>>>Не должно существовать таких строк: A>>>> A=1, B=NULL, C=NULL, D=NULL B>>>.......... A>>>>Могут существовать такие строки: A>>>> A=1, B=NULL, C=NULL, D=NULL B>>>........
B>>>???
A>>Нужно смотреть не отдельно настроки, а на совокупности строк. Наверное, я не очень очевидно написал — подправил исходное сообщение.
КД>Чего то не пойму я с двух стаканов — выше указанная пара допустима или нет?
Здравствуйте, Alexan, Вы писали:
A>Хочется решить эту проблему на уровне сервера. Пока видится в качестве решения только триггер. Но даже там не хочется перечислять все поля во всевозможных сочетаниях. Может кто сталкивался с подобной задачей?
Прежде всего нужно указать СУБД. Чтобы не тратить зря свое и чужое время на догадки.
Я пока вижу три варианта:
1. Разобраться, откуда и почему возникло такое ограничение, связывающее много записей и весьма неестественное для реляционной модели. Чаще всего такие ограничения свидетельствуют о неверной физической или даже логической модели БД.
2. Добавляем поле, содержащее битовую маску заполненности остальных полей. В триггере формируем эту маску и ищем соответствующее записи. Как сделать эффктивным такой поиск, отдельный вопрос.
3. Создаем материализованное представление (или его аналог в используемой СУБД), с группировкой по признакам заполненности каждого поля, то есть максимум 2^N групп. По нему проверяем ограничение.