Как ограничить таблицу базы данных, таким образом, только одна строка может иметь конкретное значение в столбце?

Он остановился после публикации на рабочем сервере. Причина, по которой она показала мне эту ошибку, состояла в том, что она была развернута во вложенную папку. В IIS я щелкнул правой кнопкой мыши в подпапке и вычитал «Преобразовать в приложение», после чего он работал.

15
задан Trigger 9 October 2008 в 16:32
поделиться

7 ответов

Используйте функциональный индекс:

create unique index only_one_yes on mytable
(case when col='YES' then 'YES' end);

Oracle только индексирует ключи, которые не являются абсолютно пустыми, и выражение CASE здесь гарантирует, что все значения 'НЕТ' изменяются на пустые указатели и так не индексированные.

19
ответ дан 1 December 2019 в 01:46
поделиться

Это - топорный взлом, но если столбец позволяет, АННУЛИРУЕТ, то Вы могли использовать ПУСТОЙ УКАЗАТЕЛЬ вместо "НЕТ" и использовать "ДА" так же, как прежде. Примените ограничение уникального ключа к тому столбцу, и Вы никогда не будете добираться два "ДА" значения, но все еще иметь много НОМЕРОВ

Обновление: @Nick Pierpoint: предложенное добавление проверочного ограничения так, чтобы значения столбцов были ограничены просто "ДА" и ПУСТЫМ УКАЗАТЕЛЕМ. Синтаксис все разработан в его ответе.

6
ответ дан 1 December 2019 в 01:46
поделиться

Это не работает над определением таблицы.

Однако при обновлении таблицы с помощью триггера, называя хранимую процедуру Вы могли бы удостовериться, что только одна строка содержит "ДА".

  1. Набор все строки к "НЕТ"
  2. Набор строка Вы хотите к ДА
3
ответ дан 1 December 2019 в 01:46
поделиться

Вы захотите проверить статью Tom Kyte с точно этим вопросом, который задают и его ответ:

http://tkyte.blogspot.com/2008/05/another-of-day.html

Сводка: не используйте триггеры, не используйте автономные транзакции, используйте две таблицы.

при использовании базы данных Oracle, затем НЕОБХОДИМО узнать AskTom и получить его книги.

4
ответ дан 1 December 2019 в 01:46
поделиться

Следуя за моим комментарием к предыдущему ответу yukondude, я добавил бы уникальный индекс и проверочное ограничение:

create table mytest (
    yesorno varchar2(3 char)
);

create unique index uk_mytest_yesorno on mytest(yesorno);

alter table mytest add constraint ck_mytest_yesorno check (yesorno is null or yesorno = 'YES');
2
ответ дан 1 December 2019 в 01:46
поделиться

Oracle поддерживает что-то как фильтрованные индексы (на прошлой неделе, я слышал, что, например, MSSQL2008 делает)? Возможно, можно определить уникальный ключ , который применяет только к строкам со значением "Да" в столбце.

1
ответ дан 1 December 2019 в 01:46
поделиться

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

-2
ответ дан 1 December 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: