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

Sql 如何从oracle中的列中删除默认值?,sql,oracle,Sql,Oracle,表中的列有一个默认值sysdate,我想更改它,使其不获得默认值,我该如何做?唯一的方法是重新创建表 ALTER TABLE YourTable MODIFY YourColumn DEFAULT NULL; 在Toad中,这很容易做到,只需右键单击表并选择“重建表”。蟾蜍将创建脚本,该脚本将重命名该表并重新创建一个新表。脚本将重新创建索引、约束、外键、注释等。。。并用数据填充表 只需修改脚本以删除相关列后的“default null”。是正确的,因为带有default null的列在功能上等

表中的列有一个默认值sysdate,我想更改它,使其不获得默认值,我该如何做?

唯一的方法是重新创建表

ALTER TABLE YourTable MODIFY YourColumn DEFAULT NULL;
在Toad中,这很容易做到,只需右键单击表并选择“重建表”。蟾蜍将创建脚本,该脚本将重命名该表并重新创建一个新表。脚本将重新创建索引、约束、外键、注释等。。。并用数据填充表

只需修改脚本以删除相关列后的“default null”。

是正确的,因为带有
default null的列在功能上等同于从未为该列定义过默认值:如果一列没有默认值,插入新行而不为该列指定值会导致
NULL

然而,Oracle在内部清楚地代表了这两种情况,通过查看。(这适用于Oracle 10.x、11.x和12.x,可能也适用于旧版本。)

  • 已创建列或
    ALTER
    ed且
    默认为空的情况:

    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
            …
       )
    
  • 从未指定默认值:

    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)
            …
       )
    
  • 如上所示,在一个重要的情况下,这种毫无意义的区别会对Oracle的输出产生影响:当使用提取表定义时

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


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

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


    注意:正如tejoe在评论中指出的那样,如果您依赖get_ddl来比较表,这并不能解决问题,但至少从所有_tab_列中选择data_default将返回(null)而不是null。

    这不是完全正确的。如果将默认值设置为
    NULL
    ,则不会删除该值。Oracle文档显示,无法删除默认值:如果列具有默认值,则可以使用default子句将默认值更改为NULL,但不能完全删除默认值。也就是说,如果一个列曾经被分配了一个默认值,那么用户选项卡列数据字典视图的数据默认列将始终显示一个默认值或NULL。”@Michael-O在功能上等同于没有默认值时的情况吗?(如果是这样的话,人们会想,为什么他们不让它保持一致,并在内部默认为所有内容设置
    DEFAULT
    ,默认值为
    NULL
    。作为最终用户,我不必关心这样的内部细节。)@jpmc26,你说得对,它们在功能上是等价的。然而,在某些情况下,它们是相同的。(这只是导致我断定Oracle是一个极不友好的程序员数据库的许多愚蠢的角落案例之一。)@DanLenski-我完全不同意这个结论。@Alexerm,怎么会这样?你能更具体一点吗?你可以删除列,然后再添加一次。
    ALTER TABLE mytable drop column;ALTER TABLE mytable add mycolumn DATE;
    这确实有效,唯一的问题是它会将列移到列列表的底部。如果你想按照列顺序,删除并重新创建表。我会查看drop DEFAULT;我不知道它是否完全等于DEFAULT null,但似乎更具体。从Oracle 12开始,它没有
    drop DEFAULT
    ☹. 这正是问题所在,也是我们需要使用
    DEFAULT NULL
    来解决这个问题的原因(您在oracle.com上找到的对
    DROP DEFAULT
    的任何引用都可能与MySQL有关……MySQL现在是oracle拥有的一个完全独立的数据库。)这不是真的。get_ddl将返回您的列默认值(NULL)而不仅仅是“YourColumn”@tejoe:-(你是对的,它不能解决get_ddl的问题,我会修改答案。但是,如果你比较默认值,它就解决了问题,这正是我在本例中所需要的。答案仍然不正确。实际上,它只是一种显示解决方法。一些工具会将空值放在括号中,因此默认值看起来是一样的。但是像这样的“从数据默认值不为null的所有列中选择数据默认值”仍然会找到它。这就是我所需要的。最初的问题不是关于get ddl输出,所以我认为我的答案是可以的,可以将默认值设置为(null)我不认为这是一个显示解决方案,工具只是显示所有选项卡列系统视图的内容,其中包含(NULL)或NULL。
    ALTER TABLE YourTable MODIFY YourColumn DEFAULT (null);