使列默认为 NULL 显式

Posted

技术标签:

【中文标题】使列默认为 NULL 显式【英文标题】:Make column default to NULL explicitly 【发布时间】:2015-12-19 05:34:08 【问题描述】:

如何显式地将一列设为默认值?

我想在 Oracle SQL Developer 中声明一个列默认为 NULL。我知道如果我根本没有定义任何默认值,NULL 将是默认值。但是,如果我想明确地定义NULL,如何将其定义为默认值?

-- 1: Does not work.
ALTER TABLE MY_TABLE ADD (
  MY_COLUMN TIMESTAMP(6) DEFAULT null
);

-- 2: Does not work.
ALTER TABLE MY_TABLE ADD (
  MY_COLUMN TIMESTAMP(6) DEFAULT NULL
);

-- 3: Does not work.
ALTER TABLE MY_TABLE ADD (
  MY_COLUMN TIMESTAMP(6) DEFAULT (null)
);

-- 4: This works.
ALTER TABLE MY_TABLE ADD (
  MY_COLUMN TIMESTAMP(6)
);

在情况 1-3 中,默认值为字符串(“NULL”、“null”或“(null)”),但不是实际的NULL 值。那么,我在这里缺少什么?

// 编辑:

案例(a)和(b)对应案例1和2。在SQL Developer中显示nullNULL的文本值。案例 (c) 对应于案例 4,其中明确设置了 real (null) 值。屏幕截图是在 SQL Developer 中表的 选项卡上截取的。

SQL Developer http://s1.postimg.org/fclraa0dp/SQL_Developer.png

【问题讨论】:

除了满足自己的好奇心之外,你还有什么理由想要这个吗? (这是一个正当的理由,但其他原因可能会提示其他答案。) 工作得很好:sqlfiddle.com/#!9/c0113/1 一定还有其他事情你没有告诉我们。您收到的确切错误消息是什么? (顺便说一句:语句 1,2 和 3 是相同的) 因为正在使用的 SQL 客户端与问题无关。在情况 1-3 中,默认值将 not 是字符串。它是一个null 值。 “它只是将没有(null)值作为默认值”到底是什么意思 - 你希望这个空值在哪里被“放置”?它不会出现在表格的 DDL 中吗?运行插入时是否不插入空值? 嗯,关于默认默认值的问题。好吧,我猜如果默认默认值为 null,那么 Oracle 是否选择明确标识是内部问题。我认为这是一个问题示例,有助于了解解决方案会帮助解决什么问题(如果有的话)。 @user1438038 您了解SQL Developer 只是Oracle RDBMS 的一个接口,而SQL Developer 本身并没有该列的默认值吗?它只是从数据库目录中读取它。当没有设置默认值时,可以修改 SQL Developer 以使单词“NULL”显示为列的默认值,但这只是一个表示问题,与数据库中的默认值完全不同。跨度> 【参考方案1】:

由于nullNULL(null) 是同一个东西,我不明白问题出在哪里。

这也不是 SQL Developer 的“问题”。

Oracle 只是完全按照您在系统目录中编写的方式存储默认表达式。 SQL Developer 只是将其显示出来。

假设以下陈述:

create table my_table (id integer);
alter table my_table add my_column_1 timestamp(6) default null;
alter table my_table add my_column_2 timestamp(6) default null;
alter table my_table add my_column_3 timestamp(6) default (null);

然后

select column_id, column_name, data_type, data_default
from user_tab_columns
where table_name = 'MY_TABLE'
order by column_id;

将返回以下内容:

COLUMN_ID | COLUMN_NAME | DATA_TYPE    | DATA_DEFAULT
----------+-------------+--------------+-------------
        1 | ID          | NUMBER       |             
        2 | MY_COLUMN_1 | TIMESTAMP(6) | NULL        
        3 | MY_COLUMN_2 | TIMESTAMP(6) | null        
        4 | MY_COLUMN_3 | TIMESTAMP(6) | (null)      

当您从系统中提取 DDL 时,您会再次准确地了解您编写的原因:

select dbms_metadata.get_ddl('TABLE', 'MY_TABLE', user)
from dual;

返回:

  CREATE TABLE "TK_HIRAC"."MY_TABLE" 
   (    "ID" NUMBER(*,0), 
    "MY_COLUMN_1" TIMESTAMP (6) DEFAULT NULL, 
    "MY_COLUMN_2" TIMESTAMP (6) DEFAULT null, 
    "MY_COLUMN_3" TIMESTAMP (6) DEFAULT (null)
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS NOLOGGING
  TABLESPACE "USERS" 

【讨论】:

这种行为确实令人困惑。给人留下的印象是,该值被存储为字符串文字 null NULL 或 (null),即使它实际上是合法的 NULL。当我偶然发现这个问题并认为我做错了什么时,我一直在挠头。【参考方案2】:

试试这个:

HUSQVIK@panel_management> CREATE TABLE MY_TABLE (C1 NUMBER NULL);

表已创建。

HUSQVIK@panel_management> ALTER TABLE MY_TABLE ADD (
  2    MY_COLUMN TIMESTAMP(6) DEFAULT NULL
  3  );

表已更改。

HUSQVIK@panel_management>

为我工作。

【讨论】:

这仍然是默认的NULL。这里的NULL 指定该列可以为空,而不是默认值为NULL 通过您的编辑,这是 OP 提供的选项之一,因为它不起作用。 那很好。 :) 这可能意味着 OP 正在使用其他版本。在这种情况下,我通常会要求 OP 就该问题提供更具体的信息,但这已经完成了。 这将设置默认值NULL,但它只是文本。不是(null),在没有价值的意义上。我在 SQL Developer 4.0.1.14 上。你用的是什么版本? @user1438038 如果您在 SQL Developer 上为该列设置默认值的单元格中键入 NULL,那么这不是正在发出的 SQL -- SQL Developer 正在设置 DEFAULT "NULL ",而不是 SQL。

以上是关于使列默认为 NULL 显式的主要内容,如果未能解决你的问题,请参考以下文章

第一行Kotlin系列Intent隐式显式跳转及向下传值

第一行Kotlin系列Intent隐式显式跳转及向下传值

将列值显式设置为null SQL Developer

为啥将类特殊功能显式声明为“默认” [重复]

在类模板实例化中为某些参数显式使用默认值

C++17 中的显式默认构造函数