Как создать проверку, чтобы убедиться, что только одна запись в столбце может иметь конкретное значение на основе идентификатора из другого столбца в SQL? - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь создать новую таблицу в SQL Developer, которая имеет четыре столбца.В одном столбце есть числовое значение ORG_ID, этот ORG_ID может быть одинаковым для нескольких записей в таблице.Другой столбец называется DEFAULT_FLAG, этот столбец содержит только символ Y или N, обозначающий, является ли он записью по умолчанию для таблицы для этого ORG_ID.

Я пытаюсь создать CHECK в столбце DEFAULT_FLAG, который обеспечиваеттолько одна запись с Y для всех записей с одинаковым ORG_ID.Вот пример того, как это будет выглядеть:

xxxx|xxxx|ORG_ID|DEFAULT_FLAG
xxxx|xxxx|123456| Y
xxxx|xxxx|123456| N
xxxx|xxxx|987654| Y
xxxx|xxxx|567495| Y

В приведенной выше таблице вторая запись для ORG_ID 123456 должна быть отклонена, если Y был вставлен как DEFAULT_FLAG.

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

default_flag varchar(1)
constraint  one_default Check(ORG_ID AND DEFAULT_FLAG != "Y"),

Ответы [ 3 ]

0 голосов
/ 27 марта 2019

Создайте уникальный индекс для всех ORG_ID записей с 'Y', поэтому каждая ORG_ID может иметь только одну строку с 'Y':

create unique index idx on mytable(case when default_flag = 'Y' then org_id end)
0 голосов
/ 27 марта 2019

Я думаю, что технически лучшее решение, чем решение от Торстена Кеттнера, но с использованием той же идеи,

CREATE UNIQUE INDEX ON mytable(org_id)
WHERE default_flag = 'Y';

Но позвольте мне также предложить таблицу organization_defaults с двумя столбцами, один из которых IDдля организации и других организаций лучше использовать идентификатор для mytable, как это предлагается в комментариях к ОП.

0 голосов
/ 27 марта 2019

Это слишком долго для комментария.

Вы пытаетесь использовать проверочное ограничение для чего-то, для чего оно не предназначено. У вас есть org_id. У вас должна быть таблица organizations, которая использует этот идентификатор в качестве своего первичного ключа.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...