Oracle SQL - 将 列 的 数据 默认 值 更改 为 NULL - NULL 和 ( null ) 之间 是否 有 区别 ?

pn9klfpd  于 2022-11-22  发布在  Oracle
关注(0)|答案(1)|浏览(550)

我在Oracle SQL数据库中有两列。这两列的data_default为'0000'
在sqldeveloper上,它们看起来如下所示:

我想删除data_default(不要问为什么要在nullable = No列中这样做)并达到以下状态:

我尝试了以下查询:
ALTER TABLE table_name MODIFY column_name DEFAULT NULL
但我得到的结果看起来是这样的:

所以有两个问题:
1.(null)和NULL(如果有)之间有什么区别?
1.是否有办法达到所需的状态?

8ulbf1ek

8ulbf1ek1#

前两个图像中的(null)是SQL Developer显示的真空值的虚拟值,因此您可以看到一些内容。如果转到“工具”-〉“首选项”-〉“数据库”-〉“高级”,则会有一个“将空值显示为”的选项,该选项将设置为“(null)"。如果将其更改为其他值,则该值将显示在查询输出中。
在第三个图像中,data_default值实际上不是null,它是(长)字符串值'NULL'
如果你从来没有为一列设置过默认值,那么data_default实际上是空的,但是如果你设置了它,然后试图取消设置它,那么它不会恢复为一个真正的空值,它将保留为你为修改提供的任何值,就像你提供的一样--包括大小写。你将它设置为NULL,所以它显示为NULL;如果将其修改为null,则会显示null
这并不重要。实际上,当您执行插入操作并省略该列时,data_default的值将嵌入到语句中。它实际执行的操作可能要复杂得多,但您可以将其视为动态SQL,它将转换为:

'insert into table_name (id) values (42)'

'insert into table_name (id, column_name) values (42, '
  || (select data_default from user_tab_columns where column_name = 'COLUMN_NAME')
  || ')'

所以就算最后变成

'insert into table_name (id, column_name) values (42, null)'

'insert into table_name (id, column_name) values (42, NULL)'

'insert into table_name (id, column_name) values (42, NuLl)'

在您将它改回null之前,它实际上已经转换为:

'insert into table_name (id, column_name) values (42, ''0000'')'

如果创建一个表,其中的列没有默认值,然后设置一个默认值,再将其设置为空,则会出现这种情况:
第一个
| 数据行名称|数据类型|数据默认值|
| - -|- -|- -|
| 识别码|编号| * 空值 *|
| 数据行名称|变量2| * 空值 *|
第一个
| 数据行名称|数据类型|数据默认值|
| - -|- -|- -|
| 识别码|编号| * 空值 *|
| 数据行名称|变量2|“0000”|
第一个
| 数据行名称|数据类型|数据默认值|
| - -|- -|- -|
| 识别码|编号| * 空值 *|
| 数据行名称|变量2|无|
第一个
| 识别码|数据行名称|
| - -|- -|
| 一个| * 空值 *|
| 2个|千|
| 三个| * 空值 *|
fiddle
当没有默认值和存在空默认值时,实际的默认值是真空值(在db〈〉fiddle中以斜体显示,而不是“(null)”)。
因此,在第二个映像中显示“(null)”和在第三个映像中显示“NULL”之间没有实际区别。这只是设置和恢复的值以及Oracle处理和记录该值的方式的假象。它不会影响稍后插入到表中的数据。

相关问题