当前位置: 首页 > 知识库问答 >
问题:

添加带有空字符串作为默认值和NOTNULL约束的列会导致oracle数据库的行为不一致

潘楚
2023-03-14

执行此sql后,我无法理解oracle数据库中发生了什么:

CREATE TABLE EMPTYSTRING
( 
COLUMNA VARCHAR2(1)
);

INSERT INTO EMPTYSTRING (COLUMNA) VALUES('X');

ALTER TABLE EMPTYSTRING ADD
(
COLUMNB VARCHAR2(1) DEFAULT '' NOT NULL
);

正如我读到的,oracle将空字符串视为空字符串。但为什么要添加一个默认值为“null”的列和一个表示值不能为null的约束?

更重要的是,既然它是合法的,那么如何内在地对待它呢?如果我们尝试

SELECT * FROM EMPTYSTRING WHERE COLUMNB='';
SELECT * FROM EMPTYSTRING WHERE COLUMNB IS NULL;

我们没有结果。另一方面,如果我们尝试

SELECT * FROM EMPTYSTRING;
SELECT * FROM EMPTYSTRING WHERE TRIM(COLUMNB) IS NULL;

我们得到:

COLUMNA COLUMNB
------- -------
X               

那么数据库中到底写了什么呢?为什么会这样?

如果我们尝试插入一行而不为COLUMNB指定值

INSERT INTO EMPTYSTRING (COLUMNA) VALUES('Y');

我们得到了“cannot insert NULL”错误,所以默认为空字符串实际上不起作用,除了添加COLUMNB之前表中的行。

共有1个答案

颛孙英勋
2023-03-14
ALTER TABLE EMPTYSTRING ADD
(
   COLUMNB VARCHAR2(1) DEFAULT '' NOT NULL
);

正如我读到的,oracle将空字符串视为空字符串。但为什么要添加一个默认值为“null”的列和一个表示值不能为null的约束?

SGBD无法验证您的约束是否合理。默认约束用于在列中插入默认值。如果没有指定其他值,则默认值将添加到所有新记录中。Oracle不会检查默认值是否符合其他约束,因此如果您以这种方式编写约束,Oracle不会发出错误信号(不会有ORA错误消息)。当您试图插入一条记录而不定义COLUMNB的值时,就会出现问题。

首先,它将尝试将“”赋予COLUMNB(为NULL),然后应用为COLUMNB定义的约束(确保该值不为NULL)。这将导致错误ORA-01407,表示无法更新(…)为空。

选择*从EMPTYSTRING其中列=";

从EMPTYSTRING中选择*,其中COLUMNB为空;

在甲骨文中,我们不能写sth=null(意思是它是否为null)。如果我们有两个空值,它们仍然是不同的(空被定义为不等于自身)。检查COLUMNB是否为null的唯一方法是使用is null。所以第一个将不返回任何行,即使COLULMNB实际上有空值。第二个将为COLUMNB返回值为null的行,但由于NOTNULL约束,不存在这样的行。

 类似资料:
  • 问题内容: 是否可以通过SQL语句确保列的默认值为空字符串而不是? 问题答案: 是-使用DEFAULT约束:

  • 问题内容: 是否可以通过SQL语句确保列的默认值为空字符串而不是? 问题答案: 是-使用DEFAULT约束:

  • 我对Liquibase有点陌生。我遇到了一个场景,在一个中,它试图首先添加默认值,而不是旁边的空约束。 但这里的问题是两者都

  • 我正在将错误消息添加到登录屏幕。 虽然代码运行良好,并且执行我希望它执行的操作。它会在执行时导致约束错误。 以下是受影响的约束: 下面是导致errorView出现的函数。 如何在不破坏约束的情况下更改约束? 我尝试self.view.update约束()-但是什么也没有做。我还尝试在添加约束之前删除它们,但是仍然有一个错误。 任何帮助都将不胜感激! 编辑: 我找到了一个Objective-c解决方

  • 我在写Fizz Buzz的时候遇到了一个意想不到的互动。如果我执行

  • 关于Oracle中对可为空的列进行唯一约束定义的可能解决方案,我想向你们请教/收集一些想法。 null 现在困难的部分来了。我决定,在这个表中,可以存储更多(独立)客户的数据。为此,我添加了名为customer_code的新列。这段代码实际上将表分割成不同的空格,而每个客户只能看到自己的数据。 为此,引入了oracle vpd(虚拟专用数据库)。 每个客户都使用自己的oracle用户 登录时,将加