Oracle,NULL但不是NULL

时间:2013-09-18 14:16:16

标签: sql oracle null oracle-sqldeveloper isnull

如果我在我的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)

3 个答案:

答案 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子句的列。

  1. 创建新列
  2. 损坏的一个
  3. 中复制数据
  4. 删除使用default子句
  5. 创建的列
  6. 重命名新创建的列。
  7. 示例:

    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),但我认为它的运行方式是相同的。