最佳答案
可能的复制品:
为什么 Oracle 9i 将空字符串视为 NULL
我在 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
命令都将成功。它们将创建两行,一行具有 null
值,另一行在 TEMP_TABLE
的 DESCRIPTION
列中具有空字符串 ''
。
现在,如果我发出以下 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
约束的列中。为什么会这样?