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

  1. 使用一个整数,并且不要为它分配除 0 或 1 之外的任何值。

  2. 使用以“Y”或“N”作为仅有的两个值的字符字段。

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

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

有帮助吗?

解决方案

我发现 链接有用。

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

最常见的设计是模仿Oracle Data Dictitary视图使用的许多类似布尔的标志,选择“ y”作为true,而“ n”作为false。但是,要与主机环境(例如JDBC,OCCI和其他编程环境)正确互动,最好选择0 for forse,而1对于True 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);`

其他提示

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

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

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

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

0/1的优点:

  • 独立于语言。如果每个人都使用“Y”和“N”就可以了。但他们没有。在法国,他们使用“O”和“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)并且在左连接中,您会将错误与不存在的记录混为一谈。

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

如果您想与甲骨文队的一位高层真正深入地讨论这个问题,请查看汤姆·凯特对此的看法 这里

我大部分工作的数据库都使用“Y”/“N”作为布尔值。通过该实现,您可以实现一些技巧,例如:

  1. 计算正确的行数:
    从 X 中选择 SUM(CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0)

  2. 对行进行分组时,强制执行“如果一行为 true,则所有行都为 true”逻辑:
    从 Y 中选择 MAX(BOOLEAN_FLAG)
    相反,如果一行为 false,则使用 MIN 强制分组为 false。

一个通过向 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.

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top