当我不知道约束的名称时,如何在Oracle中删除“非空”约束?
我有一个数据库在一个字段上有一个NOT NULL约束,我想删除这个约束。复杂的因素是这个约束具有一个系统定义的名称,并且该约束的名称在生产服务器,集成服务器和各种开发人员数据库中不同。我们目前的过程是检查变更脚本,并且一个自动化任务通过sqlplus针对目标数据库执行适当的查询,所以我更喜欢可以直接发送到sqlplus的解决方案。当我不知道约束的名称时,如何在Oracle中删除“非空”约束?
在我自己的数据库,要删除SQL,这将是:
alter table MYTABLE drop constraint SYS_C0044566
我能看到的约束,当我查询all_constraints
观点:
select * from all_constraints where table_name = 'MYTABLE'
,但我不知道如何使用SEARCH_CONDITION
的LONG
数据类型,或者即使知道其名称后如何最好地动态删除查找的约束。
那么,如何创建一个可以基于它是什么来放弃这个约束的变更脚本,而不是它的名字是什么?
编辑: @艾伦的回答是一个很好的,但我担心(我缺乏甲骨文的专业知识),它可能不是普遍适用的是,可能有一个系统生成的名称的任何约束将有与之相关联的一种方法可以在不必知道名称的情况下删除约束。是否真的总是有一种方法可以避免在逻辑上删除该约束时知道系统命名约束的名称?
alter table MYTABLE modify (MYCOLUMN null);
在Oracle中,当为列指定非空值时,不会自动创建空约束。同样,当列更改为允许空值时,它们会自动丢弃。
澄清修订后的问题:此解决方案仅适用于为“非空”列创建的约束。如果您在列定义中指定“主键”或检查约束而未命名它,则最终将为约束(以及索引,主键)生成一个系统生成的名称。在这些情况下,您需要知道名称才能删除它。最好的建议是通过确保您为除“not null”以外的所有约束指定名称来避免该情况。如果您发现自己处于需要一般性地删除其中一个约束的情况,那么您可能需要使用PL/SQL和数据定义表。
这似乎真的太好了,但它确实处理我目前的情况,并且很简单!在oracle中是否有任何情况下,约束名称可能是系统生成的,但无法写入sql来避免这样的约束名称? – 2010-03-29 19:27:57
谢谢......事实证明'not null'约束是我的模式中唯一的系统命名约束,可能会以这种方式影响我。 – 2010-03-29 19:43:19
尝试:
alter table <your table> modify <column name> null;
它的工作原理。谢谢 – 2015-02-16 12:23:01
只要记住,如果你想为空的领域是主键的一部分,你不能。主键不能有空字段。
我正面临着同样的问题,试图绕过自定义检查约束,我需要更新以允许不同的值。问题是ALL_CONSTRAINTS没有办法告诉哪个列应用了约束。我设法做到的方法是查询ALL_CONS_COLUMNS,然后通过名称删除每个约束并重新创建它。
选择constraint_name命令 从ALL_CONS_COLUMNS 在表格名= [TABLE_NAME] 和列名= [COLUMN_NAME];
要发现使用任何约束,使用下面的代码:
-- 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类。
只是为了满足您的好奇心:NOT NULL约束是Oracle中的* only *约束类型,您可以在不需要知道约束名称的情况下移除它。所有其他约束类型您需要知道约束的名称。 – 2012-06-11 06:21:04