首页 文章

Oracle中的布尔字段

提问于
浏览
142

昨天我想在Oracle表中添加一个布尔字段 . 但是,Oracle中实际上没有布尔数据类型 . 有没有人知道模拟布尔值的最佳方法?谷歌搜索主题发现了几种方法

  • 使用整数,只是不要为它分配除0或1以外的任何东西 .

  • 使用带有“Y”或“N”的char字段作为唯一的两个值 .

  • 使用带有CHECK约束的枚举 .

有经验的Oracle开发人员是否知道哪种方法是首选/规范的?

8 回答

  • 26

    我发现this链接很有用 .

    以下是突出显示每种方法的一些优点/缺点的段落 .

    最常见的设计是模仿Oracle数据字典视图使用的许多类似布尔的标志,选择'Y'表示true,选择'N'表示false . 但是,要与主机环境(如JDBC,OCCI和其他编程环境)正确交互,最好选择0表示false,1表示true表示它可以正常使用getBoolean和setBoolean函数 .

    基本上他们提倡方法2,为了效率,使用

    • 值为0/1(由于与JDBC的 getBoolean() 的互操作性)和检查约束

    • 一种CHAR(因为它占用的空间比NUMBER少) .

    他们的例子:

    create table tbool(bool char check(bool in(0,1));
    插入tbool值(0);
    插入tbool值(1);`

  • 4

    Oracle本身使用Y / N作为布尔值 . 为了完整性,应该注意pl / sql有一个布尔类型,只有表没有 .

    如果您使用该字段指示是否需要处理记录,则可以考虑使用Y和NULL作为值 . 这使得索引非常小(读取速度快),占用的空间非常小 .

  • 2

    要使用最少的空间,您应使用约束为“Y”或“N”的CHAR字段 . Oracle不支持BOOLEAN,BIT或TINYINT数据类型,因此CHAR的一个字节尽可能小 .

  • 28

    最好的选择是0和1(作为数字 - 另一个答案建议0和1作为空间效率的CHAR但是's a bit too twisted for me), using NOT NULL and a check constraint to limit contents to those values. (If you need the column to be nullable, then it'不是你正在处理的布尔值,而是具有三个值的枚举......)

    0/1的优点:

    • 语言无关 . 'Y'和'N'如果每个人都使用它会没问题 . 但是他们没有在芬兰编程,看看他们是否在那里使用'E'和'K' - 毫无疑问他们确实是这样 .

    • 与广泛使用的编程语言(C,C,Perl,Javascript)的实践一致

    • 使用应用程序层进行更好的播放,例如过冬

    • 导致更简洁的SQL,例如,找出准备吃多少香蕉 select sum(is_ripe) from bananas 而不是 select count(*) from bananas where is_ripe = 'Y' 或甚至(yuk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

    'Y'/'N'的优点:

    • 占用的空间少于0/1

    • 这是Oracle建议的,所以可能是一些人更习惯的东西

    另一张海报建议'Y' / null以获得性能提升 . 如果你已经证明你需要性能,那么公平,但另外避免,因为它使查询不那么自然( some_column is null 而不是 some_column = 0 ),并且在左连接中你将把错误与不存在的记录混为一谈 .

  • 5

    1/0或Y / N,带有检查约束 . 以太方式很好 . 我个人更喜欢1/0,因为我在perl中做了很多工作,这使得在数据库字段上进行perl布尔运算变得非常容易 .

    如果你想与Oracles的一位主持人一起深入讨论这个问题,请查看Tom Kyte对此有何看法Here

  • 19

    数据库我做了大部分工作,用'Y'/'N'作为布尔值 . 通过该实现,您可以实现一些技巧:

    • 计算为真的行:
      SELECT SUM(BOOLEAN_FLAG = 'Y'然后1 ELSE 0)从X开始

    • 对行进行分组时,强制执行"If one row is true, then all are true"逻辑:
      从MAX中选择MAX(BOOLEAN_FLAG)
      相反,如果一行为假,则使用MIN强制分组为false .

  • 1

    通过将"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 值,并将接受的值限制为 01 .

  • 80

    在我们的数据库中,我们使用枚举来确保我们将其传递为TRUE或FALSE . 如果你这样做的话前两种方式很容易开始为整数添加新的含义而不经过适当的设计,或者最终得到具有Y,y,N,n,T,t,F,f值的char字段记住哪个代码段使用哪个表以及它使用的是哪个版本的true .

相关问题