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

时间:2011-12-12 22:04:55

标签: sql oracle

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

4 个答案:

答案 0 :(得分:39)

ALTER TABLE YourTable MODIFY YourColumn DEFAULT NULL;

答案 1 :(得分:9)

Joe's answer是正确的,因为DEFAULT NULL的列在功能上等同于从未在第一个位置定义该列的默认值:如果是列没有默认值,插入新行而不指定该列的值会产生NULL

然而,Oracle内部明确地表示了两种情况,可以通过查看ALL_TAB_COLUMNS system view来看到。*

  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
            …
       )
    
  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)
            …
       )
    
  3. 如上所示,有一个重要的例子,这种无意义的区别会对Oracle的输出产生影响:使用DBMS_METADATA.GET_DDL()提取表定义时。

    如果您使用GET_DDL()内省数据库,那么功能相同的表的DDL输出会略有不同。

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

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

答案 2 :(得分:3)

执行所需操作的唯一方法是重新创建表。

在Toad中很容易做到,只需右键单击表并选择“Rebuild Table”。 Toad将创建脚本,该脚本将重命名表并重新创建新表。该脚本将重新创建索引,约束,外键,注释等...并使用数据填充表。

只需修改脚本,即可在相关列后删除“default null”。

答案 3 :(得分:0)

我不知道这是否适用于旧版本的Oracle,但我的一位同事实际上发现您可以使用以下命令将其正确重置为初始状态(即从未设置过): >

ALTER TABLE YourTable MODIFY YourColumn DEFAULT (null);

注意:正如tejoe在评论中指出的那样,如果您依靠get_ddl来比较表并不能解决问题,但是至少从all_tab_columns中选择data_default会返回(空)而不是NULL。