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)
您遇到的问题是您创建了一个外键而没有为约束命名.这是不好的做法,因为它使操作约束变得更加困难,因为几乎所有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)