Как сделать красиво CHECK
От: Alexan Россия  
Дата: 03.05.06 07:05
Оценка:
Добрый день!

Есть таблица из 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.

Хочется решить эту проблему на уровне сервера. Пока видится в качестве решения только триггер. Но даже там не хочется перечислять все поля во всевозможных сочетаниях. Может кто сталкивался с подобной задачей?
Re: Как сделать красиво CHECK
От: biochemist СССР https://www.anekdot.ru/i/caricatures/normal/20/7/27/1595846503.jpg
Дата: 03.05.06 07:08
Оценка:
Здравствуйте, Alexan, Вы писали:

A>Не должно существовать таких строк:

A> A=1, B=NULL, C=NULL, D=NULL
..........
A>Могут существовать такие строки:
A> A=1, B=NULL, C=NULL, D=NULL
........

???
«Национализм во мне столь естественный, что никогда никаким интернационалистам его из меня не вытравить»
Менделеев Д. И.
Re[2]: Как сделать красиво CHECK
От: Alexan Россия  
Дата: 03.05.06 07:17
Оценка:
Здравствуйте, biochemist, Вы писали:

B>Здравствуйте, Alexan, Вы писали:


A>>Не должно существовать таких строк:

A>> A=1, B=NULL, C=NULL, D=NULL
B>..........
A>>Могут существовать такие строки:
A>> A=1, B=NULL, C=NULL, D=NULL
B>........

B>???


Нужно смотреть не отдельно настроки, а на совокупности строк. Наверное, я не очень очевидно написал — подправил исходное сообщение.
Re[3]: Как сделать красиво CHECK
От: biochemist СССР https://www.anekdot.ru/i/caricatures/normal/20/7/27/1595846503.jpg
Дата: 03.05.06 07:38
Оценка:
Здравствуйте, Alexan, Вы писали:

A>Нужно смотреть не отдельно настроки, а на совокупности строк. Наверное, я не очень очевидно написал — подправил исходное сообщение.

Хорошо бы внести и СУБД, лучше с версией.
Если это Oracle — красиво вряд ли получится. Проще сделать процедуру, которая проверяет условие а потом вносит строку (если она подходит) и вставлять|апдейтить только через неё.
«Национализм во мне столь естественный, что никогда никаким интернационалистам его из меня не вытравить»
Менделеев Д. И.
Re[3]: Как сделать красиво CHECK
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.05.06 07:47
Оценка:
Здравствуйте, 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>Нужно смотреть не отдельно настроки, а на совокупности строк. Наверное, я не очень очевидно написал — подправил исходное сообщение.


Чего то не пойму я с двух стаканов — выше указанная пара допустима или нет?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: Как сделать красиво CHECK
От: Alexan Россия  
Дата: 03.05.06 08:14
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Здравствуйте, 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>>Нужно смотреть не отдельно настроки, а на совокупности строк. Наверное, я не очень очевидно написал — подправил исходное сообщение.


КД>Чего то не пойму я с двух стаканов — выше указанная пара допустима или нет?


Допустима.
Re[5]: Как сделать красиво CHECK
От: Alex.Che  
Дата: 03.05.06 08:26
Оценка:
Привет, Alexan!
Вы пишешь 03 мая 2006:

[Sorry, skipped]
КД>> Чего то не пойму я с двух стаканов — выше указанная пара допустима или нет?

A> Допустима.


Урааааа!!!!
Хотя, вообще-то, пофигу...

Надеюсь, ты представляешь себе, что для того, чтоб обеспечить
нужное тебе "ограничение", придётся лочить ВСЮ таблицу, целиком...

Это навевает на мысли о посещении если уж не проктолога,
то хотя бы консерватории...

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re: Как сделать красиво CHECK
От: wildwind Россия  
Дата: 03.05.06 08:45
Оценка:
Здравствуйте, Alexan, Вы писали:

A>Хочется решить эту проблему на уровне сервера. Пока видится в качестве решения только триггер. Но даже там не хочется перечислять все поля во всевозможных сочетаниях. Может кто сталкивался с подобной задачей?


Прежде всего нужно указать СУБД. Чтобы не тратить зря свое и чужое время на догадки.

Я пока вижу три варианта:

1. Разобраться, откуда и почему возникло такое ограничение, связывающее много записей и весьма неестественное для реляционной модели. Чаще всего такие ограничения свидетельствуют о неверной физической или даже логической модели БД.

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

3. Создаем материализованное представление (или его аналог в используемой СУБД), с группировкой по признакам заполненности каждого поля, то есть максимум 2^N групп. По нему проверяем ограничение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.