显式地将列默认为 NULL

use*_*038 4 sql oracle null default-value oracle-sqldeveloper

如何使列默认为 NULL显式

我想将 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)
);
Run Code Online (Sandbox Code Playgroud)

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

// 编辑:

情况 (a) 和 (b) 对应于情况 1 和2。SQL Developer 中显示null或的文本值NULL。情况 (c) 对应于情况 4,其中明确设置了 (null)数值。屏幕截图是在 SQL Developer中表的“列”选项卡上截取的。

SQL 开发人员 http://s1.postimg.org/fclraa0dp/SQL_Developer.png

a_h*_*ame 7

由于nullNULL(null)是同一回事,我不明白问题是什么。

这也不是 SQL 开发人员的“问题”。

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);
Run Code Online (Sandbox Code Playgroud)

然后

select column_id, column_name, data_type, data_default
from user_tab_columns
where table_name = 'MY_TABLE'
order by column_id;
Run Code Online (Sandbox Code Playgroud)

将返回以下内容:

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)      
Run Code Online (Sandbox Code Playgroud)

当您从系统中提取 DDL 时,您又会确切地知道为什么要这样写:

select dbms_metadata.get_ddl('TABLE', 'MY_TABLE', user)
from dual;
Run Code Online (Sandbox Code Playgroud)

返回:

  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" 
Run Code Online (Sandbox Code Playgroud)

  • 这种行为确实令人费解。它给人的印象是该值被存储为字符串文字 null NULL 或 (null),即使它实际上是合法的 NULL。当我偶然发现这个问题时,我很困惑,认为我做错了什么。 (2认同)

Hus*_*vik -1

尝试这个:

HUSQVIK@panel_management> CREATE TABLE MY_TABLE (C1 NUMBER NULL);
Run Code Online (Sandbox Code Playgroud)

表已创建。

HUSQVIK@panel_management> ALTER TABLE MY_TABLE ADD (
  2    MY_COLUMN TIMESTAMP(6) DEFAULT NULL
  3  );
Run Code Online (Sandbox Code Playgroud)

表已更改。

HUSQVIK@panel_management>
Run Code Online (Sandbox Code Playgroud)

对我有用。