执行此sql后,我无法理解oracle数据库中会发生什么:
CREATE TABLE EMPTYSTRING
(
COLUMNA VARCHAR2(1)
);
INSERT INTO EMPTYSTRING (COLUMNA) VALUES('X');
ALTER TABLE EMPTYSTRING ADD
(
COLUMNB VARCHAR2(1) DEFAULT '' NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
在我读到的文章中,oracle将空字符串视为null。但是,为什么要添加一个具有默认“空”值和一个约束的列,该约束说值不能为空合法值呢?
更重要的是,由于这是合法的,因此如何内部处理?如果我们尝试
SELECT * FROM EMPTYSTRING WHERE COLUMNB='';
SELECT * FROM EMPTYSTRING WHERE COLUMNB IS NULL;
Run Code Online (Sandbox Code Playgroud)
我们没有结果。另一方面,如果我们尝试
SELECT * FROM EMPTYSTRING;
SELECT * FROM EMPTYSTRING WHERE TRIM(COLUMNB) IS NULL;
Run Code Online (Sandbox Code Playgroud)
我们得到:
COLUMNA COLUMNB
------- -------
X
Run Code Online (Sandbox Code Playgroud)
那么,真正写在数据库中的是什么?为什么会这样呢?
如果我们尝试插入一行而未为COLUMNB指定值
INSERT INTO EMPTYSTRING (COLUMNA) VALUES('Y');
Run Code Online (Sandbox Code Playgroud)
我们会收到“无法插入NULL”错误,因此默认情况下,除非添加COLUMNB之前表中的行,否则默认为空字符串实际上不起作用。