Oracle中的布尔字段
昨天我想添加一个布尔字段到Oracle表。 但是,在Oracle中实际上并不存在布尔型数据types。 有没有人在这里知道模拟一个布尔值的最佳方式? 谷歌search主题发现了几种方法
-
使用一个整数,只是不打扰分配除0或1以外的任何东西。
-
使用'Y'或'N'字符作为唯一的两个值。
-
使用带CHECK约束的枚举。
有经验的Oracle开发人员知道哪种方法是首选/规范的?
我发现这个链接有用。
这里是强调每种方法的一些优点/缺点的段落。
最常见的devise是模仿Oracle数据字典视图使用的许多类似布尔的标志,select“Y”为true,“N”为false。 但是,要正确地与主机环境(如JDBC,OCCI和其他编程环境)进行交互,最好select0代表false,1代表true,这样可以正确使用getBoolean和setBoolean函数。
基本上他们主张方法2,为了效率的缘故,使用
- 值为 0/1(因为与JDBC的
getBoolean()
等)具有检查约束 - 一种CHAR(因为它使用的空间less于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有一个布尔types,只有表没有。
如果您正在使用该字段来指示是否需要处理logging,则可以考虑使用Y和NULL作为值。 这使得占用很小空间的非常小的(快速读取)索引。
要使用最less量的空间,您应该使用一个约束为“Y”或“N”的CHAR字段。 Oracle不支持BOOLEAN,BIT或TINYINT数据types,所以CHAR的一个字节尽可能小。
最好的select是0和1(作为数字 – 另一个答案build议0和1作为空间效率的CHAR ,但这有点扭曲对我来说),使用NOT NULL和检查约束限制内容到这些值。 (如果你需要列可以为空,那么它不是一个你正在处理的布尔值,而是一个具有三个值的枚举…)
0/1的优点:
- 语言独立。 如果每个人都使用它,那么'Y'和'N'会很好。 但他们没有。 在法国,他们使用“O”和“N”(我亲眼看到了这一点)。 我没有在芬兰编程,看他们是否在那里使用“E”和“K” – 毫无疑问他们比这更聪明,但是你不能确定。
- 与广泛使用的编程语言(C,C ++,Perl,Javascript)的实践相一致,
- 和应用层一起玩,比如Hibernate
- 例如,导致更简洁的SQL,以找出有多less香蕉准备吃香蕉的
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/1less
- 这是甲骨文build议的,也许是一些人更习惯的
另一张海报提出“Y”/ null为performance收益。 如果你已经certificate你需要的性能,那么公平,但否则避免,因为它使查询不那么自然( some_column is null
而不是some_column = 0
),在一个左join你会混淆虚假与不存在的logging。
1/0或Y / N上带有检查约束。 以太方式很好。 我个人更喜欢1/0,因为我在perl中做了很多工作,并且它使得在数据库字段上执行perl布尔操作变得非常简单。
如果你想和ORACLE的头把手一起真正深入地讨论这个问题,那么请查看Tom Kyte对此的评论。
我做了大部分工作的数据库都使用了'Y'/'N'作为布尔值。 有了这个实现,你可以得到一些技巧,如:
-
计数是真的行:
SELECT SUM(BOOLEAN_FLAG ='Y'then 1 ELSE 0时的情况)从X开始 -
在对行进行分组时,强制执行“如果一行是真的,那么都是真的”逻辑:
从MAX中selectMAX(BOOLEAN_FLAG)
相反,如果一行为假,则使用MIN强制分组。
通过向Oracle数据库中的现有表添加“布尔”列(使用number
types)来实现接受的答案的工作示例:
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
创build一个名为my_new_boolean_column
的新列,默认值为0.该列不接受NULL
值,并将接受的值限制为0
或1
。
在我们的数据库中,我们使用一个枚举来确保我们传递TRUE或FALSE。 如果你这样做,前两种方法中的任何一种,如果不经过适当的devise就开始给整数增加新的含义,或者结束于具有Y,y,N,n,T,t, F和f值,并且必须记住哪个代码段使用哪个表以及它正在使用的是哪个版本。