使列默认为 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中显示null
或NULL
的文本值。案例 (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】:
由于null
、NULL
和(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 显式的主要内容,如果未能解决你的问题,请参考以下文章