powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Допускает ли синтаксис языка такое ограничение?
16 сообщений из 16, страница 1 из 1
Допускает ли синтаксис языка такое ограничение?
    #38938861
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В именно IB/FB не спец, потому обращаюсь к специалистам.

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

Иными словами - в выборке
Код: sql
1.
2.
3.
SELECT field
FROM table
WHERE valid = TRUE


значения должны быть уникальны, в то время как значение поля field вообще (безотносительно к valid) может быть неуникальным.

Третьими словами - может существовать сколько угодно записей с одним и тем же field и valid = FALSE плюс одна или ни одной записи с тем же field и valid = TRUE.

Допускает ли синтаксис IB/FB написание такого CONSTRAINT?
Если да - как именно будет выглядеть соотв. CREATE? И уж совсем хорошо - какая минимальная версия сервера требуется для такого синтаксиса?

PS. К сожалению, деление справочника на части и построение объединяющей вьюшки не проходит - над БД имеется приложение с закрытым кодом, а получающийся вьюв - необновляемый.
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38938947
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaполучающийся вьюв - необновляемый.В файрберде вьюхи обновлямые (если написать соответствующие триггеры) см. доку http://www.firebirdsql.org/refdocs/langrefupd25-ddl-view.html

Akinaзначения должны быть уникальны, в то время как значение поля field вообще (безотносительно к valid) может быть неуникальным.например делаешь char поле допускающее нуллы (назовем его constreint_field), где не нулл значение строго один символ заранее заданный - это условно true, нулл, соответственно, false.

Далее строишь композитный уникальный индекс по выражению (пусть поле для которого требуется ограничение это need_uniq_field ):
constreint_field || need_uniq_field
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38938951
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaИ уж совсем хорошо - какая минимальная версия сервера требуется для такого синтаксиса?Лучше брать поддерживаемые. в старых куча ограничений на длину варчара по которому индекс.
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38938970
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaделение справочника на части и построение объединяющей вьюшки не проходит -
над БД имеется приложение с закрытым кодом, а получающийся вьюв - необновляемый.
Как тебе уже сказали, это не так.

Но если очень уж приспичило - создай уникальный вычисляемый индекс по выражению CASE WHEN
valid = TRUE THEN field END.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939063
Фотография Tonal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё один вариант:
valid: integer, где 0 - элемент действителен, а любое другое значение - недействителен.
Уникальность по 2 полям field и valid.
Для получения уникального недействительного значения использовать генератор.
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939174
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Походу, меня не поняли до конца.

Меня интересует не решение иными средствами, а именно существование синтаксической конструкции, позволяющеё задать именно такой констрейнт.

Dimitry SibiryakovНо если очень уж приспичило - создай уникальный вычисляемый индекс по выражению CASE WHEN
valid = TRUE THEN field END.


Вот это уже похоже на правду. Допустим, мне нужно создать уникальный индекс по выражению CASE WHEN valid = TRUE THEN field ELSE CONCAT(ID+field) END (такое выражение обеспечит требуемый функционал - значение поля field гарантированно начинается буквой, а ID - первичный индекс). Если я верно понимаю то, что написано в доках, то это будет выглядеть как-то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE UNIQUE INDEX myConstraint 
ON myTable
COMPUTED BY (
    CASE WHEN valid = TRUE 
    THEN field 
    ELSE (CAST(id AS CHAR) || field) 
    END
)



Верна ли эта синтаксическая конструкция?
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939183
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.
Akina CAST(id AS CHAR)
скорее всего быстро переполнение вызовет надо CAST(id AS CHAR(18)) ставить.
2. Тип BOOLEAN есть только начиная с Firebird 3

А так вроде похоже на правду
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939190
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaPS. К сожалению, деление справочника на части и построение объединяющей вьюшки не проходит - над БД имеется приложение с закрытым кодом, а получающийся вьюв - необновляемый.

С помощью триггеров вьюха легко может стать обновляемой.
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939205
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисвьюха легко может стать обновляемой.Слишком много сопутствующих сложностей. Слишком массивное вмешательство в структуру. Хрен знает, упущу чего, потом будет щастье - оно мне надо? А вот замена уникального индекса на обычный плюс вот такой хитрозадый уник гораздо менее болезненна.
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939238
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaДопустим, мне нужно создать уникальный индекс по выражению CASE WHEN valid =
TRUE THEN field ELSE CONCAT(ID+field) END (такое выражение обеспечит требуемый функционал
- значение поля field гарантированно начинается буквой, а ID - первичный индекс).
Нахрена там ELSE часть? Без неё требуемый функционал обеспечится ничуть не хуже.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939277
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНахрена там ELSE часть?Шоб "слоники бегали".

Зачем вообще case если простая склейка пары полей смотиртся куда проще и читаемей?
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939288
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНахрена там ELSE часть? Без неё требуемый функционал обеспечится ничуть не хуже.
Мне неизвестно, что вернёт этот CASE для valid=false (NULL?) и как отнесётся к повтору такого значения уникальный индекс. А рыть доки по вопросу, который в следующий раз мне понадобится хрен знает когда, немного лениво.
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939289
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

уникальный индекс допускает дубликаты NULL
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939295
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пачка нуллов под уникальным индексом живет запросто.
т.к NULL != NULL
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939296
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyЗачем вообще case если простая склейка пары полей смотиртся куда
проще и читаемей?
Во-первых, она будет работать только если флаг валидности для невалидных записей NULL. В
противном случае она не позволит множества одинаковых невалидных значений.
Во-вторых, пойдёт преобразование к строке, что, в зависимости от типа поля данных, может
ухудшить характеристики индекса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Допускает ли синтаксис языка такое ограничение?
    #38939316
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВо-первых, она будет работать только если флаг валидности для невалидных записей NULL. В
противном случае она не позволит множества одинаковых невалидных значений.
Во-вторых, пойдёт преобразование к строке, что, в зависимости от типа поля данных, может
ухудшить характеристики индекса.Не пойму о чем спор, обы условия выполнены:
Akinaнекое поле (допустим, варчар), которое требует уникальности
Ivan_Pisarevskyделаешь char поле допускающее нуллы (назовем его constreint_field), где не нулл значение строго один символ заранее заданный - это условно true, нулл, соответственно, false.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Допускает ли синтаксис языка такое ограничение?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]