首页 文章

当我不知道约束的名称时,如何在Oracle中删除“not null”约束?

提问于
浏览
71

我有一个数据库,在字段上有一个NOT NULL约束,我想删除这个约束 . 复杂因素是此约束具有系统定义的名称,并且该约束的名称在 生产环境 服务器,集成服务器和各种开发人员数据库之间不同 . 我们当前的过程是检入更改脚本,并且自动化任务通过sqlplus对目标数据库执行适当的查询,因此我更喜欢可以直接发送到sqlplus的解决方案 .

在我自己的数据库中,删除它的SQL将是:

alter table MYTABLE drop constraint SYS_C0044566

查询 all_constraints 视图时,我可以看到约束:

select * from all_constraints where table_name = 'MYTABLE'

但是我不知道如何使用 SEARCH_CONDITIONLONG 数据类型或者即使在我知道它的名字之后如何最好地动态删除查找的约束 .

那么,我如何创建一个更改脚本,可以根据它的内容而不是它的名称来删除这个约束?


编辑:@ Allan的回答很好,但我担心(由于我缺乏Oracle的专业知识),任何可能具有系统生成名称的约束都可能与其相关联,这可能并不普遍 . 约束而不必知道它的名字 . 在逻辑上删除该约束时,总会有一种方法可以避免必须知道系统命名约束的名称吗?

5 回答

  • 1
    alter table MYTABLE modify (MYCOLUMN null);
    

    在Oracle中,如果未为列指定null,则不会自动创建空约束 . 同样,当列更改为允许空值时,它们会自动删除 .

    Clarifying the revised question :此解决方案仅适用于为"not null"列创建的约束 . 如果在未定义命名的情况下在列定义中指定"Primary Key"或检查约束,则需要知道要删除它的名称 . 最好的建议是通过确保为除"not null"之外的所有约束指定名称来避免该场景 . 如果您发现自己需要一般地放弃其中一个约束,那么您可能需要求助于PL / SQL和数据定义表 .

  • 143

    尝试:

    alter table <your table> modify <column name> null;
    
  • 0

    请记住,如果要使其成为可空的字段是主键的一部分,则不能 . 主键不能包含空字段 .

  • 1

    要发现使用的任何约束,请使用以下代码:

    -- Set the long data type for display purposes to 500000.
    
    SET LONG 500000
    
    -- Define a session scope variable.
    
    VARIABLE output CLOB
    
    -- Query the table definition through the <code>DBMS_METADATA</code> package.
    
    SELECT dbms_metadata.get_ddl('TABLE','[Table Described]') INTO :output FROM dual;
    

    这基本上显示了如何创建引用表的create语句 . 通过了解表的创建方式,您可以看到所有表约束 .

    答案取自Michael McLaughlin的博客:http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/来自他的数据库设计I课程 .

  • 16

    我遇到了同样的问题,试图解决我需要更新的自定义检查约束以允许不同的值 . 问题是ALL_CONSTRAINTS没有办法告诉哪个列应用了约束 . 我设法做到的方法是通过查询ALL_CONS_COLUMNS,然后通过名称删除每个约束并重新创建它 .

    从all_cons_columns中选择constraint_name,其中table_name = [TABLE_NAME]和column_name = [COLUMN_NAME];

相关问题