create table supplier(
.
.
.
city varchar2(16) references city(city_name)
);
什么是正确的查询?如何使用ALTER TABLE在Oracle-SQL中删除内联外键?
alter table suppliers modify city varchar2(16);
create table supplier(
.
.
.
city varchar2(16) references city(city_name)
);
什么是正确的查询?如何使用ALTER TABLE在Oracle-SQL中删除内联外键?
alter table suppliers modify city varchar2(16);
你的问题是,你已经创建了一个外键不给一个名称约束。这是不好的做法,因为它使操作约束变得更加困难,因为几乎所有的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
你想这样做:
ALTER TABLE supplier
DROP CONSTRAINT constraint_name
如果你没有给约束明确的名称,甲骨文asigned一个给你,所以你必须先找到它。你可以列出所有,例如:表约束
SELECT *
FROM user_constraints
WHERE TABLE_NAME='SUPPLIER'
这听起来正确...如果查询返回没有行呢? – 2011-12-27 09:33:54
如果在SUPPLIER上有多个外键约束,那么您的简单查询就不够用了。 – APC 2011-12-27 09:35:39
@popstack - 我在表名中使用了大写字母,尝试删除where子句并添加'ORDER BY TABLE_NAME'以防万一。 – 2011-12-27 10:02:26
欢迎堆栈溢出。您可以使用工具栏按钮格式化源代码。这次我为你做了。 – 2011-12-27 09:19:36
阅读有关语法的Oracle文档。您会惊讶于通过阅读文档您还学到了什么;) – someuser2 2011-12-27 12:14:46