如何使用ALTER TABLE删除Oracle-SQL中的内联外键?

pop*_*ack 2 sql oracle foreign-keys alter-table

create table supplier(  
.  
.  
.  
city varchar2(16) references city(city_name)  
);  
Run Code Online (Sandbox Code Playgroud)

什么是正确的查询?

alter table suppliers modify city varchar2(16);  
Run Code Online (Sandbox Code Playgroud)

APC*_*APC 9

您遇到的问题是您创建了一个外键而没有为约束命名.这是不好的做法,因为它使操作约束变得更加困难,因为几乎所有Oracle DDL都需要对象名称.

当我们没有明确命名约束时,Oracle会生成一个默认值.这些都非常相似,无法确定约束实际上做了什么.例如,如果您在SUPPLIER上有三个外键约束,则需要加入USER_CONS_COLUMNS视图,以查看哪个约束实际上对CITY列强制执行规则.

所以,供将来参考,

city varchar2(16) constraint city_fk references city(city_name)
Run Code Online (Sandbox Code Playgroud)

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

 select constraint_name 
 from user_constraints
 where table_name = 'CITY' 
 and constraint_type = 'P'
Run Code Online (Sandbox Code Playgroud)

接下来,将该名称提供给此查询:

 select constraint_name 
 from user_constraints
 where table_name = 'SUPPLIER' 
 and constraint_type = 'R'
 and r_constraint_name = '&CITY_PK'
Run Code Online (Sandbox Code Playgroud)

最后,删除约束:

alter table supplier drop constraint city_fk
Run Code Online (Sandbox Code Playgroud)