2010-12-16 54 views
3

我想禁用NOT NULL约束到表中插入数据进行测试,但我找不到禁用未命名约束的方法。有没有办法在oracle中禁用/启用未命名的约束?

我发现足够的信息来禁用命名的约束,但我找不到禁用未命名的NOT NULL约束的示例。

我想在不查询数据字典的情况下实现此操作,但是......如果只有这样,我愿意这样做。但我想用干净的ALTER TABLE DDL。

+0

技术上不存在这样的东西作为Oracle的“未命名的约束”。如果你不自己命名,困难的是,Oracle给它一个名字 - 这个名字会因实例而异。这就是为什么我总是命名所有约束,除了NOT NULL约束(永远不需要明确命名)。 – 2010-12-17 06:42:00

+0

你是对的杰弗里,感谢您的评论。我在谈论的约束是由数据库生成的名称,而不是由用户创建的。 – im8bit 2010-12-17 17:03:51

回答

4

您将需要查询数据字典,像这样的事情将禁用表上的所有约束。但请注意,这将禁用系统范围内的约束,而不仅仅是针对您的会话。也许您真正想要的是推迟约束?

drop table testxx 

drop table testxx succeeded. 
create table testxx (id number not null) 

create table succeeded. 
select status from user_constraints where table_name = 'TESTXX' 

STATUS 
-------- 
ENABLED 

1 rows selected 

begin 
for cnames in (select table_name,constraint_name from user_constraints where table_name = 'TESTXX') loop 
    execute immediate 'alter table ' || cnames.table_name || ' disable constraint ' || cnames.constraint_name; 
    end loop; 
end; 

anonymous block completed 
select status from user_constraints where table_name = 'TESTXX' 

STATUS 
-------- 
DISABLED 

1 rows selected 
+0

感谢马修,它看起来像查询数据字典是唯一的方法去。谢谢! – im8bit 2010-12-16 15:18:11

5

你也可以改变列如下

create table test_null (col_n number not null); 
alter table test_null modify col_n number null; 
+0

感谢加里,它也可以工作,我发现这个选项的问题是它提交了任何挂起的更改到表,我真的想要避免这一点。 – im8bit 2010-12-17 17:01:39

相关问题