当我不知道约束的名称时,如何在Oracle中删除“not null”约束?
我有一个数据库有一个字段的NOT NULL约束,我想要删除这个约束。 复杂的因素是这个约束有一个系统定义的名字,而且这个约束的名称在生产服务器,集成服务器和各种开发者数据库中是不同的。 我们目前的过程是检查变更脚本,一个自动化的任务通过sqlplus对目标数据库执行适当的查询,所以我更喜欢一个可以直接发送到sqlplus的解决scheme。
在我自己的数据库上,删除这个SQL将是:
alter table MYTABLE drop constraint SYS_C0044566
当我查询all_constraints
视图时,我可以看到这个约束:
select * from all_constraints where table_name = 'MYTABLE'
但我不知道如何处理SEARCH_CONDITION
的LONG
数据types,或者即使在知道它的名字后,如何最好地dynamic删除查找的约束。
那么,如何创build一个可以基于它是什么来放弃这个约束的变更脚本,而不是它的名字是什么呢?
编辑:@艾伦的答案是一个很好的答案,但我担心(在我缺乏Oracle专业知识),可能不是普遍真实的任何约束,可能有一个系统生成的名称将与它关联的方式来删除约束而不必知道它的名字。 是否真的总是有一种方法可以避免在逻辑上删除该约束条件时必须知道系统命名约束的名称?
alter table MYTABLE modify (MYCOLUMN null);
在Oracle中,如果为列指定了非空值,则不会自动创build空约束。 同样,当列更改为空值时,它们会自动丢弃。
澄清修订后的问题 :此解决scheme仅适用于为“非空”列创build的约束。 如果您在列定义中指定了“主键”或一个检查约束而没有对其进行命名,那么您将最终得到一个系统生成的约束名称(以及索引,即主键)。 在这些情况下,您需要知道名称以删除它。 最好的build议是通过确保为除“not null”之外的所有约束指定一个名称来避免这种情况。 如果你发现自己需要一般地放弃这些约束条件之一,那么你可能需要求助于PL / SQL和数据定义表。
尝试:
alter table <your table> modify <column name> null;
只要记住,如果你想要可以为空的字段是主键的一部分,你不能。 主键不能有空字段。
要发现使用的任何约束,请使用下面的代码:
-- 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;
这本质上显示了如何创build引用表的create语句。 通过知道如何创build表,您可以看到所有的表约束。
来自Michael McLaughlin博客的答案: http : //michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/从他的Database Design I类。
我正面临着同样的问题试图绕过自定义检查约束,我需要更新,以允许不同的值。 问题是,ALL_CONSTRAINTS没有办法告诉哪个列应用了约束。 我设法做的方式是通过查询ALL_CONS_COLUMNS,然后删除每个约束的名称并重新创build它。
从all_cons_columns中selectconstraint_name,其中table_name = [TABLE_NAME]和column_name = [COLUMN_NAME];