Булево поле в Oracle

Вчера я хотел добавить логическое поле в таблицу Oracle. Однако в Oracle нет логического типа данных. Кто-нибудь здесь знает лучший способ симулировать логическое значение? Погуглив тему обнаружил несколько подходов

  1. Используйте целое число и просто не удосуживайтесь присвоить ему что-либо кроме 0 или 1.

  2. Используйте поле типа char с Y или N в качестве единственных двух значений.

  3. Используйте перечисление с ограничением CHECK.

Знают ли опытные разработчики Oracle, какой подход является предпочтительным / каноническим?

вопрос задан 27.08.2008
Eli Courtwright
114878 репутация

8 ответов


  • 0 рейтинг

    Рабочий пример реализации принятого ответа путем добавления столбца «Boolean» в существующую таблицу в базе данных Oracle (с использованием типа number):

    ALTER TABLE my_table_name ADD (
    my_new_boolean_column number(1) DEFAULT 0 NOT NULL
    CONSTRAINT my_new_boolean_column CHECK (my_new_boolean_column in (1,0))
    );
    

    Это создает новый столбец в my_table_name с именем my_new_boolean_column со значениями по умолчанию 0. Столбец не будет принимать значения NULL и ограничивает допустимые значения 0 или 1.

    ответ дан Ben.12, с репутацией 456, 3.10.2016
  • 0 рейтинг

    Либо 1/0, либо Y / N с проверочным ограничением. Эфирный путь в порядке. Лично я предпочитаю 1/0, так как я много работаю в Perl, и это действительно облегчает выполнение логических операций Perl над полями базы данных.

    Если вы хотите действительно углубленное обсуждение этого вопроса с одним из оракулов Хонко, посмотрите, что Том Кайт говорит об этом Здесь

    ответ дан Matthew Watson, с репутацией 10834, 31.08.2008
  • 0 рейтинг

    В наших базах данных мы используем перечисление, которое гарантирует, что мы передадим ему значение ИСТИНА или ЛОЖЬ. Если вы сделаете это одним из первых двух способов, слишком легко либо начать добавлять новое значение к целому числу, не проходя правильного проектирования, либо заканчивая тем, что поле char содержит Y, y, N, n, T, t, Значения F, f и необходимость помнить, какой раздел кода использует какую таблицу и какую версию true она использует.

    ответ дан Ryan Ahearn, с репутацией 5976, 27.08.2008
  • 0 рейтинг

    Я нашел эту ссылку полезной.

    Вот параграф, освещающий некоторые плюсы и минусы каждого подхода.

    Наиболее часто встречающийся дизайн - это имитация множества логических Флаги, которые используют представления словаря данных Oracle, выбирая «Y» для true и «N» для ложного. Однако для правильного взаимодействия с хостом среды, такие как JDBC, OCCI и другие среды программирования, лучше выбрать 0 для ложного и 1 для истинного, чтобы он мог работать правильно с функциями getBoolean и setBoolean.

    В основном они защищают метод № 2, для эффективности, используя

    • значения 0/1 (из-за совместимости с JDBC getBoolean() и т. Д. ) с проверочным ограничением
    • a тип CHAR (потому что он использует меньше места, чем NUMBER).

    Их пример:

    create table tbool (bool char check (bool in (0,1));
    insert into tbool values(0);
    insert into tbool values(1);`
    
    ответ дан ColinYounger, с репутацией 4440, 27.08.2008
  • 0 рейтинг

    Чтобы использовать наименьшее количество места, вы должны использовать поле CHAR, ограниченное 'Y' или 'N'. Oracle не поддерживает типы данных BOOLEAN, BIT или TINYINT, поэтому один байт CHAR настолько мал, насколько вы можете получить.

    ответ дан Bill the Lizard, с репутацией 283013, 27.08.2008
  • 0 рейтинг

    Наилучшим вариантом являются 0 и 1 (в виде чисел - другой ответ предлагает 0 и 1 как CHAR для экономии пространства, но для меня это слишком сложно), используя NOT NULL и проверочное ограничение для ограничения содержимого этими значениями. (Если вам нужно, чтобы столбец обнулялся, то вы имеете дело не с логическим значением, а с перечислением трех значений. , , )

    Преимущества 0/1:

    • Не зависит от языка. «Y» и «N» было бы хорошо, если бы все использовали это. Но они этого не делают. Во Франции они используют «О» и «N» (я видел это своими глазами). Я не программировал в Финляндии, чтобы увидеть, используют ли они там «E» и «K» - несомненно, они умнее этого, но вы не можете быть уверены.
    • Соответствует практике в широко используемых языках программирования (C, C ++, Perl, Javascript)
    • Играет лучше с прикладным уровнем e. г. Спящий
    • Приводит к более лаконичному SQL, например, чтобы узнать, сколько бананов готовы съесть select sum(is_ripe) from bananas вместо select count(*) from bananas where is_ripe = 'Y' или даже (юк) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

    Преимущества 'Y' / 'N':

    • Занимает меньше места, чем 0/1
    • Это то, что предлагает Oracle, так что может быть то, что некоторые люди более привыкли к

    Другой плакат предложил «Y» / ноль для повышения производительности. Если вы доказали , что вам нужна производительность, , то достаточно справедливо, но в противном случае избегайте, так как это делает запросы менее естественными (some_column is null вместо some_column = 0), и в левом соединении вы будете сопоставлять ложность с несуществующими записями.

    ответ дан Andrew Spencer, с репутацией 6551, 6.05.2013
  • 0 рейтинг

    Сам Oracle использует Y / N для логических значений. Для полноты следует отметить, что pl / sql имеет логический тип, а не таблицы.

    Если вы используете поле, чтобы указать, нужно ли обрабатывать запись или нет, вы можете рассмотреть возможность использования Y и NULL в качестве значений. Это делает очень маленький (быстро читаемый) индекс, который занимает очень мало места.

    ответ дан Leigh Riffel, с репутацией 4027, 21.10.2008
  • 0 рейтинг

    База данных, над которой я работал большую часть своей работы, использовала 'Y' / 'N' в качестве логического значения. С этой реализацией вы можете выполнить некоторые трюки, такие как:

    1. Количество строк, которые являются истинными:
      ВЫБЕРИТЕ СУММУ (СЛУЧАЙ, КОГДА BOOLEAN_FLAG = 'Y' ТОГДА 1 ИЛИ 0) ОТ X

    2. При группировке строк используйте логику «Если одна строка истинна, то все верны»:
      ВЫБЕРИТЕ МАКС. (BOOLEAN_FLAG) ОТ Y
      И наоборот, используйте MIN для принудительной группировки false, если одна строка имеет значение false.

    ответ дан Erick B, с репутацией 1133, 27.08.2008