如何从oracle中的列中删除默认值?

Dan*_*nny 38 sql oracle

表中的列的默认值为sysdate,我想更改它以使其没有默认值,我该怎么做?

Joe*_*lli 39

ALTER TABLE YourTable MODIFY YourColumn DEFAULT NULL;
Run Code Online (Sandbox Code Playgroud)

  • 这不完全正确.您不会删除将其设置为"NULL"的默认值.无法删除默认值,Oracle文档说:"如果列具有默认值,则可以使用DEFAULT子句将默认值更改为NULL,但不能完全删除默认值.即,如果列具有曾经有一个默认值,那么USER_TAB_COLUMNS数据字典视图的DATA_DEFAULT列将始终显示默认值或NULL." (28认同)
  • @Michael-O在功能上等同于没有"DEFAULT"的时候?(如果是的话,人们不得不想知道为什么他们不只是让它保持一致并且默认情况下在内部给所有的`DEFAULT`为'NULL`.作为最终用户,我不应该关心那样的内部细节.) (7认同)
  • @ jpmc26,你是对的,它们在*功能*等效.但是,有些情况下[它会影响数据库内省的输出,正如我在回答中所写](http://stackoverflow.com/a/372​​65135/20789).(这只是许多愚蠢的角落案例中的一个,这使我得出结论,Oracle是一个非常程序员不友好的数据库.) (6认同)

Dan*_*ski 9

乔的回答是在这个意义上,有一栏正确的DEFAULT NULL功能上等同于具有从未在首位的是列定义的默认值:如果一列没有默认值,插入新行不指定该列结果的值NULL.

但是,Oracle通过查看ALL_TAB_COLUMNS系统视图可以在内部清楚地表示这两种情况.*

  1. 已创建或ALTER编辑列的情况DEFAULT NULL:

    create table foo (bar varchar2(3) default null);
    
    select default_length, data_default from all_tab_columns where table_name='FOO';
    
    => default_length    data_default
       --------------    ------------
       4                 NULL
    
    select dbms_metadata.get_ddl('TABLE','FOO') from dual;
    
    => CREATE TABLE "FOO"
       (    "BAR" VARCHAR(3) DEFAULT NULL
            …
       )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 没有默认指定:

    create table foo (bar varchar2(3));
    
    select default_length, data_default from all_tab_columns where table_name='FOO';
    
    => default_length    data_default
       --------------    ------------
       (null)            (null)
    
    select dbms_metadata.get_ddl('TABLE','FOO') from dual;
    
    => CREATE TABLE "FOO"
       (    "BAR" VARCHAR(3)
            …
       )
    
    Run Code Online (Sandbox Code Playgroud)

如上所示,有一个重要的情况是,这种无意义的区别DBMS_METADATA.GET_DDL()会对Oracle的输出产生影响:用于提取表定义时.

如果您正在使用GET_DDL()内省数据库,那么对于功能相同的表,您将获得略微不同的DDL输出.

GET_DDL()用于版本控制和数据库的多个实例之间的比较时,这真的很烦人,除了手动修改输出GET_DDL()或完全重新创建没有默认值的表之外,没有办法避免它.

*至少对于Oracle 10g,11g和12c.