Oracle 中的 Boolean 字段

昨天我想向 Oracle 表中添加一个布尔字段。然而,甲骨文并没有真正的布尔。这里有人知道模拟布尔值的最佳方法吗?在谷歌上搜索这个主题发现了几种方法

  1. 使用一个整数,除了0或1之外,不要为它赋值任何值。

  2. 使用只有两个值为“ Y”或“ N”的字段。

  3. 使用带 CHECK 约束的枚举。

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

211068 次浏览

在我们的数据库中,我们使用一个枚举来确保传递给我们的结果是 TRUE 或者 FALSE。如果你采用前两种方法中的任何一种,都很容易在没有经过正确设计的情况下开始给整数添加新的含义,或者最终得到的字符字段有 Y,y,N,n,T,t,F,f 值,并且必须记住代码的哪个部分使用哪个表以及它使用的是哪个版本的 true。

我发现 这个链接很有用。

下面的段落强调了每种方法的一些优缺点。

最常见的设计是模仿许多布尔型 标记 Oracle 的数据字典视图使用的,选择“ Y”为 true 和’N’表示假。但是,要正确地与主机交互 环境,例如 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));
insert into tbool values(0);
insert into tbool values(1);`

为了使用最少的空间,您应该使用限制为“ Y”或“ N”的 CHAR 字段。Oracle 不支持 BOOLEAN、 BIT 或 TINYINT 数据类型,因此 CHAR 的一个字节已经很小了。

我做的大部分工作都是在数据库中使用‘ Y’/‘ N’作为布尔值。通过这种实现,您可以实现以下一些技巧:

  1. 计算为真的行:
    从 X

  2. 中选择 SUM (CASE WHEN BOOLEAN _ FLAG = ‘ Y’THEN 1 ELSE 0)
  3. 对行进行分组时,强制执行“如果一行为真,则所有行为真”逻辑:
    从 Y 中选择 MAX (BOOLEAN _ Flag)
    相反,如果一行为 false,则使用 MIN 强制分组 false

带有检查约束的1/0或 Y/N。无论哪种方式都可以。我个人更喜欢1/0,因为我在 perl 中做了很多工作,它使得在数据库字段上执行 perl 布尔操作变得非常容易。

如果你想要一个真正深入的讨论这个问题与甲骨文的头头之一,看看汤姆凯特说什么关于这个 给你

Oracle 本身使用 Y/N 表示布尔值。为了完整起见,应该注意 pl/sql 具有布尔类型,只有表没有布尔类型。

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

最好的选择是0和1(作为数字-另一个答案建议0和1作为空间效率的 CHAR,但这对我来说有点扭曲) ,使用 NOT NULL 和检查约束来限制内容到这些值。(如果需要使列为空,那么所处理的不是布尔值,而是具有三个值的枚举...)

0/1的优点:

  • 语言独立。如果大家都用 Y 和 N 就好了。但他们没有。在法国,他们用‘ O’和‘ N’(我亲眼见过)。我还没有在芬兰编程看看他们是否使用‘ E’和‘ K’,毫无疑问,他们比那更聪明,但你不能肯定。
  • 与广泛使用的编程语言(C,C + + ,Perl,Javascript)中的实践相一致
  • 可以更好地使用应用程序层,例如 Hibernate
  • 例如,导致更简洁的 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
  • 这是甲骨文的建议,可能是一些人更习惯的

另一张海报建议“ Y”/null 表示业绩增长。如果你有 证明了,你需要的性能,那么足够公平,但否则避免,因为它使查询不那么自然(some_column is null而不是 some_column = 0) ,在左连接,你会合并虚假与不存在的记录。

通过在 Oracle 数据库中的现有表中添加一个“ Boolean”列(使用 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