2

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

我的问题是为什么?我要求不为空。

如果我运行:

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)
4

3 回答 3

2

列的可空性存储在 中NULLABLE,而不是存储在 中DATA_DEFAULT。存储列的DATA_DEFAULT默认值(如果您没有在CREATE TABLE语句中提供默认值,则所有列都会得到DEFAULT NULL(甚至是不可为空的!)

尝试:

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
于 2013-09-18T14:43:46.740 回答
2

正如@Rob正确指出的那样,您很可能将其分配NULL为列的默认值。不幸的是,一旦为列分配了默认值,您就无法删除data_default- 数据字典视图的列user_tab_columns将始终包含数据。

注意:如果列有默认值,则可以使用 DEFAULT 子句将默认值更改为 NULL,但不能完全删除默认值。如果一个列曾经被分配了一个默认值,那么 USER_TAB_COLUMNS 数据字典视图的 DATA_DEFAULT 列将始终显示一个默认值或 NULL。

如果您希望此条件DATA_DEFAULT IS NOT NULL成功,唯一的选择是重新创建不带default子句的列。

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

例子:

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
于 2013-09-18T15:17:06.937 回答
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),但我认为它的运行方式相同。

于 2013-09-18T14:39:41.657 回答