我在 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")
NULL
在 Oracle 中,空字符串被视为一个值。
如果我删除了列not null
上的约束,DESCRIPTION
那么基本表结构将如下所示
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | | VARCHAR2(4000)|
+--------------+-----------+---------------+
并且INSERT
指定的两个命令都会成功。他们将在. null
_''
DESCRIPTION
TEMP_TABLE
现在,如果我发出以下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