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中表的“列”选项卡上截取的。
由于null,NULL和(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)
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)
对我有用。
| 归档时间: |
|
| 查看次数: |
18524 次 |
| 最近记录: |