我在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
约束,因此两者都不成功。
在这两种情况下,Oracle都抱怨
ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")
在Oracle中,空字符串被视为NULL
值。
如果我在not null
列上删除DESCRIPTION
约束,那么基本表结构将如下所示
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | | VARCHAR2(4000)|
+--------------+-----------+---------------+
并且指定的两个INSERT
命令都将成功。他们会在null
的{{1}}列中创建两行''
和另一行DESCRIPTION
。{/ p>
现在,如果我发出以下TEMP_TABLE
命令,
SELECT
然后它会在SELECT * FROM temp_table WHERE description IS NULL;
列中提取其中一个具有null
值而另一个具有空字符串''
的行。
但是,以下DESCRIPTION
语句不会从SELECT
TEMP_TABLE
它甚至没有检索SELECT * FROM temp_table WHERE description='';
列中包含空字符串的行。
据推测,似乎Oracle在此处理DESCRIPTION
值和空字符串null
的方式不同,但''
语句似乎不是这样的不会将INSERT
值和空字符串null
插入到具有''
约束的列中。为什么会这样?
答案 0 :(得分:84)
这是因为Oracle在内部将空字符串更改为NULL值。 Oracle根本不会允许插入一个空字符串。
另一方面,SQL Server可以让你做你想要实现的目标。
这里有2个解决方法:
当然,两者都是愚蠢的解决方法:)
答案 1 :(得分:28)
在oracle中,空的varchar2和null被视为相同,您的观察结果显示出来。
当你写:
select * from table where a = '';
与写作相同
select * from table where a = null;
而不是a is null
永远不会等同于true,所以永远不要返回一行。在插入时,NOT NULL表示您无法插入null或空字符串(被视为null)