我有一个数据库,它在一个字段上有一个非空约束,我想删除这个约束。复杂的因素是该约束具有系统定义的名称,并且该约束的名称在生产服务器、集成服务器和各种开发人员数据库之间是不同的。我们当前的流程是签入更改脚本,自动任务通过sqlplus对目标数据库执行适当的查询,所以我更喜欢直接发送到sqlplus的解决方案。
在我自己的数据库上,要删除它的SQL是:
alter table MYTABLE drop constraint SYS_C0044566
当我查询all_constraints
视图时,我可以看到约束:
select * from all_constraints where table_name = 'MYTABLE'
但是我不确定如何使用SEARCH_CONDITION
的LONG
数据类型,或者如何最好地动态删除查找到的约束,即使我知道它的名称。
那么,我如何创建一个更改脚本来根据约束是什么而不是它的名称来删除该约束呢?
编辑:@Allan的答案很好,但我担心(因为我缺乏Oracle专业知识)可能并不是所有的约束都具有系统生成的名称,并且有一种方法可以在不知道约束名称的情况下删除约束。在逻辑删除约束时,总是有一种方法可以避免知道系统命名约束的名称,这是真的吗?
发布于 2010-11-28 14:12:45
尝试:
alter table <your table> modify <column name> null;
发布于 2012-12-01 03:57:21
只需记住,如果你想要设置为空的字段是主键的一部分,你就不能这样做。主键不能有空字段。
发布于 2015-05-23 06:58:47
要发现所使用的任何约束,请使用以下代码:
-- 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的博客:来自他的数据库设计I班的http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/。
https://stackoverflow.com/questions/2540615
复制相似问题