在Oracle SQL中删除表

sri*_*sri 2 sql oracle foreign-keys

每当我尝试删除表或创建表时,它都会显示以下错误:

DROP TABLE SUBURB;
DROP TABLE STOCKITEM;
DROP TABLE MANUFACTURER;
DROP TABLE WAREHOUSE;
DROP TABLE CITY;
DROP TABLE STATE;
Run Code Online (Sandbox Code Playgroud)

第1行出错:ORA-02449:外键引用的表中的唯一/主键

 CREATE TABLE STATE (
 statecode varchar(3)
 ,statename varchar(30)
 ,population number(8)
 ,primary key(statecode)
  );
Run Code Online (Sandbox Code Playgroud)

第1行出错:ORA-00955:现有对象已使用名称

任何人都可以解释为什么会这样吗?

APC*_*APC 9

如果您确实想要删除表,即使它在外键中被引用,您可以像这样强制它:

drop table state cascade constraints;
Run Code Online (Sandbox Code Playgroud)

正如我们所料,此语法在Oracle SQL Reference中定义.

请注意,这会丢弃任何外键关系.因此,您需要在重建表(及其主键)后重新创建它们.通常情况下这是可以的,因为最常见的用例是在开发或CI环境中删除和重新创建模式.

我们使用它cascade constraints 来使我们的构建脚本更易于维护.有两种选择:

  1. 在删除表之前,使用脚本或动态SQL显式删除外键约束.
  2. 订购DROP TABLE语句,以便首先删除相关表,以及它们讨厌的外键.对于少数表来说足够容易,对于大型模式来说更加痛苦.


Piy*_*iya 5

您可以使用下面的查询来获取在删除表之前应删除的表的引用。

select table_name, constraint_name, status, owner
from dba_constraints
where 1=1
--and r_owner = :p_owner --if you know schema
and constraint_type = 'R'
and r_constraint_name in
(
   select constraint_name from dba_constraints
   where constraint_type in ('P','U')
   and lower(table_name) = lower(:p_table_name)
   --and r_owner = :p_owner
)
order by table_name, constraint_name
Run Code Online (Sandbox Code Playgroud)