【发布时间】:2015-04-23 05:13:32
【问题描述】:
我在 Oracle 10g 中有一个名为 TEMP_TABLE 的表,只有两列 - id 和 description 只是为了演示。
id 列是NUMBER(35, 0) not null 类型的序列生成主键,DESCRIPTION 列是VARCHAR2(4000) not null 类型。
本例中的基本表结构如下所示。
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | NOT NULL | VARCHAR2(4000)|
+--------------+-----------+---------------+
创建此表后,我尝试交替插入以下INSERT 命令。
INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, ''); ->unsuccessful
它们都没有成功,因为not null 约束是在DESCRIPTION 列上强制执行的。
在这两种情况下,甲骨文都抱怨
ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")
空字符串在 Oracle 中被视为 NULL 值。
如果我在 DESCRIPTION 列上删除了 not null 约束,那么基本表结构将如下所示
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | | VARCHAR2(4000)|
+--------------+-----------+---------------+
并且指定的两个INSERT 命令都会成功。他们将在TEMP_TABLE 的DESCRIPTION 列中创建两行,一个具有null 值,另一个具有空字符串''。
现在,如果我发出以下SELECT 命令,
SELECT * FROM temp_table WHERE description IS NULL;
然后它获取两个行,其中一个具有null 值,而另一个具有DESCRIPTION 列中的空字符串''。
下面的SELECT 语句没有从TEMP_TABLE 中检索任何行
SELECT * FROM temp_table WHERE description='';
它甚至不检索在DESCRIPTION 列中有空字符串的行。
据推测,Oracle 似乎在这里以不同的方式处理 null 值和空字符串 '',但在 INSERT 语句中似乎不是这种情况,其中 null 值和空字符串'' 被阻止插入到具有not null 约束的列中。为什么会这样?
【问题讨论】:
-
您如何看到其中一个描述字段为空字符串,而另一个字段为空?
-
@Flansch- 大概,我假设那些
INSERT语句,因为我不知道空字符串''被转换成null值,对不起。 -
您可能想阅读this
标签: oracle null oracle10g string