如果我在我的oracle数据库上运行此查询:
SELECT COLUMN_NAME,
DATA_DEFAULT,
DATA_TYPE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'MY_TABLE'
AND DATA_DEFAULT IS NOT NULL;
我得到的结果是:
STOICHIOMETRY NULL NUMBER
我的问题是为什么?我已经要求不是NULL。
如果我跑:
describe MY_TABLE
我明白了:
Name Null Type
------------- -------- ------------
TID NOT NULL NUMBER(9)
COMPONENT_ID NOT NULL NUMBER(9)
RELATIONSHIP NOT NULL VARCHAR2(20)
STOICHIOMETRY NUMBER(3)
TARGCOMP_ID NOT NULL NUMBER(9)
HOMOLOGUE NOT NULL NUMBER(1)
答案 0 :(得分:2)
列的可为空性存储在NULLABLE
中,而不是DATA_DEFAULT
中。 DATA_DEFAULT
存储列的默认值(如果您未在CREATE TABLE
语句中提供默认值,则所有列都会获得DEFAULT NULL
(即使是不可为空的列!)< / p>
尝试:
SELECT COLUMN_NAME,
DATA_DEFAULT,
DATA_TYPE,
NULLABLE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'MY_TABLE'
AND NULLABLE = 'N'; -- 'N' means No, not nullable
-- 'Y' means Yes, nullable
答案 1 :(得分:2)
作为@Rob correctly pointed out,您很可能将NULL
指定为列的默认值。
不幸的是,you cannot remove一旦为列分配了默认值 - data_default
数据字典视图的user_tab_columns
列将始终包含数据。
注意:如果列具有默认值,则可以使用DEFAULT 子句将默认值更改为NULL,但是无法删除 完全默认值。如果列具有默认值 分配给它,然后是USER_TAB_COLUMNS的DATA_DEFAULT列 数据字典视图将始终显示默认值或 NULL。
如果您希望此条件DATA_DEFAULT IS NOT NULL
成功,唯一的选择是重新创建没有default
子句的列。
default
子句示例:
create table TB_Test(
col number default null
);
insert into tb_test(col)
select level
from dual
connect by level <= 11;
select column_name,
data_default,
data_type
from user_tab_columns
where table_name = upper('tb_test')
and data_default is not null
Column_Name Data_Default Data_Type
--------------------------------------
COL null NUMBER
^
|
string literal
SQL> alter table tb_test add col2 number;
Table altered
update tb_test
set col2 = col
SQL> alter table tb_test drop column col;
Table altered
SQL> alter table tb_test rename column col2 to col;
Table altered
select column_name,
data_default,
data_type
from user_tab_columns
where table_name = upper('tb_test')
and data_default is not null
no rows selected
答案 2 :(得分:1)
我认为NULL是你的默认值?例如,我有一个表,我已将默认值更改为NULL:
ALTER TABLE UNIQUEVALTEST MODIFY ZIP DEFAULT NULL;
现在我选择:
SELECT COLUMN_NAME, DATA_DEFAULT
FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'UNIQUEVALTEST'
AND data_default IS NOT NULL;
我明白了:
ZIP NULL
编辑:为了更好地解释,如果字段为(null),则没有默认值。但是现在默认值设置为NULL,因此除非另有说明,否则插入的任何新数据都将自动为NULL。我不知道这是否会改变功能(没有默认值,或者默认值设置为NULL),但我认为它的运行方式是相同的。