Как создать уникальное ограничение, которое не позволит использовать любой другой символ? - PullRequest
0 голосов
/ 14 ноября 2018

Я использую Oracle 12c. У меня есть таблица с именем myTestTab, и в этой таблице есть столбец с именем «активный». Столбец определен как

ACTIVE  varchar2(1)

Так что в этот столбец можно ввести только один символ. Теперь для этого столбца

  • Может быть не более одной строки , в которой может быть значение «Y».
  • Кроме того, необходимо добавить проверочное ограничение, чтобы в этот столбец можно было вводить только «Y» (чтобы пользователь не мог ввести любое другое значение).

До сих пор, чтобы соответствовать требованию, я создал индекс для этой таблицы как:

create  unique index only_one_yes on myTestTab (case when upper(ACTIVE)='Y' then   'Y'  else '' end);

Однако он не устанавливает нижний регистр y как верхний регистр y, и он принимает любой другой символ, если он уникален. Могу ли я получить представление о том, как это исправить?

1 Ответ

0 голосов
/ 14 ноября 2018

он не устанавливает нижний регистр 'y' как верхний регистр 'y' ...

Вы не сказали это.Ваш уникальный индекс допускает не более одного значения 'y' или 'Y', но индексы не изменяют данные, поступающие в таблицу.Для этого вам нужно использовать триггер, например:

CREATE OR REPLACE TRIGGER biu_myTestTab_active_uc
  BEFORE INSERT OR UPDATE ON myTestTab
  FOR EACH ROW
BEGIN
  :new.active := UPPER(:new.active);
END;
/

... он принимает любой другой символ, если он уникален

На самом деле он принимает любой другой персонаж, независимо от того, является ли он уникальным.Вы можете вставить 'X' пять раз, если хотите, и индекс не остановит вас.Опять же, это не то, что индекс, который вы определили, может сделать.Как уже упоминалось в вашем вопросе, вам нужно проверить ограничение:

ALTER TABLE myTestTab ADD CONSTRAINT active_yes_or_null CHECK (active = 'Y' OR active IS NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...