2011-12-27 77 views
2
create table supplier( 
. 
. 
. 
city varchar2(16) references city(city_name) 
); 

什么是正确的查询?如何使用ALTER TABLE在Oracle-SQL中删除内联外键?

alter table suppliers modify city varchar2(16); 
+1

欢迎堆栈溢出。您可以使用工具栏按钮格式化源代码。这次我为你做了。 – 2011-12-27 09:19:36

+2

阅读有关语法的Oracle文档。您会惊讶于通过阅读文档您还学到了什么;) – someuser2 2011-12-27 12:14:46

回答

9

你的问题是,你已经创建了一个外键不给一个名称约束。这是不好的做法,因为它使操作约束变得更加困难,因为几乎所有的Oracle DDL都需要对象名称。

当我们没有明确命名约束时,Oracle会生成一个默认约束。这些都非常相似,并且没有办法告诉约束实际上做了什么。例如,如果您在SUPPLIER上有三个外键约束,您需要加入USER_CONS_COLUMNS视图才能看到哪个约束实际上在CITY列上实施了一条规则。

所以,以供将来参考,

city varchar2(16) constraint city_fk references city(city_name) 

无论如何,现在你需要找到外键约束的默认的名称,这样就可以把它。我们假设你对CITY表格同样宽松,所以首先我们需要找到它的主键(如果你真的知道名字,你可以跳过这个阶段)。

select constraint_name 
from user_constraints 
where table_name = 'CITY' 
and constraint_type = 'P' 

接下来,馈那名进入该查询:

select constraint_name 
from user_constraints 
where table_name = 'SUPPLIER' 
and constraint_type = 'R' 
and r_constraint_name = '&CITY_PK' 

最后,删除约束:

alter table supplier drop constraint city_fk 
2

你想这样做:

ALTER TABLE supplier 
DROP CONSTRAINT constraint_name 

如果你没有给约束明确的名称,甲骨文asigned一个给你,所以你必须先找到它。你可以列出所有,例如:表约束

SELECT * 
FROM user_constraints 
WHERE TABLE_NAME='SUPPLIER' 
+0

这听起来正确...如果查询返回没有行呢? – 2011-12-27 09:33:54

+0

如果在SUPPLIER上有多个外键约束,那么您的简单查询就不够用了。 – APC 2011-12-27 09:35:39

+0

@popstack - 我在表名中使用了大写字母,尝试删除where子句并添加'ORDER BY TABLE_NAME'以防万一。 – 2011-12-27 10:02:26