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

Chr*_*mer 78 oracle plsql constraints

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

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

alter table MYTABLE drop constraint SYS_C0044566
Run Code Online (Sandbox Code Playgroud)

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

select * from all_constraints where table_name = 'MYTABLE'
Run Code Online (Sandbox Code Playgroud)

但我不知道如何配合工作SEARCH_CONDITIONLONG数据类型或如何最好地动态删除即使我知道它的名字查找到的约束.

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


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

All*_*lan 156

alter table MYTABLE modify (MYCOLUMN null);
Run Code Online (Sandbox Code Playgroud)

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

澄清修订后的问题:此解决方案仅适用于为"非空"列创建的约束.如果在未定义命名的情况下在列定义中指定"主键"或检查约束,则最终将为约束(以及主键的索引)生成系统生成的名称.在这些情况下,您需要知道删除它的名称.最好的建议是通过确保为除"not null"之外的所有约束指定名称来避免该场景.如果您发现自己需要一般地放弃其中一个约束,那么您可能需要求助于PL/SQL和数据定义表.


小智 16

尝试:

alter table <your table> modify <column name> null;
Run Code Online (Sandbox Code Playgroud)