删除Oracle SQL中的表

9
每当我尝试删除或创建表格时,都会出现以下错误:
DROP TABLE SUBURB;
DROP TABLE STOCKITEM;
DROP TABLE MANUFACTURER;
DROP TABLE WAREHOUSE;
DROP TABLE CITY;
DROP TABLE STATE;

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

 CREATE TABLE STATE (
 statecode varchar(3)
 ,statename varchar(30)
 ,population number(8)
 ,primary key(statecode)
  );

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

有人能解释一下这是为什么吗?


8
你需要按照正确的顺序删除表格。如果TABLEATABLEB有外键关系,你就不能删除TABLEB,因为这会违反TABLEA中的外键关系。你必须先删除TABLEA,然后才能删除TABLEB - Ed Gibbs
尝试逐个执行这些操作,这样你就可以看到哪一个导致了错误的抛出。 - Bob Jarvis - Слава Україні
2
您也可以使用DROP TABLE STATE CASCADE CONSTRAINTS; 但请注意,它将删除链接表STATE的外键约束。 - Vini.g.fer
我尝试按照以下顺序删除所有表格,但无法运行。 - sri
我们能不能不用级联约束呢?@Vini.g.fer - sri
不,如果您想删除具有外键约束的表,则必须同时删除约束。如果表被删除,它们应该指向哪里? - user330315
5个回答

15

如果你真的确定想要删除这个表,即使它被外键引用,你可以强制执行以下操作:

drop table state cascade constraints;

这个语法在Oracle SQL参考手册中定义。

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

我们可以使用cascade constraints使我们的构建脚本更易于维护。有两种选择:

  1. 显式地删除删除表之前的外键约束,可以使用脚本或动态SQL。
  2. 按顺序排列DROP TABLE语句,以便首先清除依赖表及其外键。对于少量的表格来说很容易,但对于大型架构来说则更加繁琐。

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

1

如果您创建了主键并且还创建了外键,则无法删除该表。例如,如果您有学生或教师表,并且想要删除此表,则应按以下方式删除该表:

DROP TABLE students CASCADE CONSTRAINTS; 

而且你删除了教师表

DROP TABLE teachers CASCADE CONSTRAINTS;

0

SUBURB表是其他任何表的父表,首先您需要删除子表,然后才能删除SUBURB表。

在您的数据库中已经有名为STATE的表,因此您不能创建同名的表。一旦您删除了STATE表,就可以创建另一个表。


0

这是我在Oracle示例数据库中使用的有效解决方案:

DROP TABLE ['Your_Table_Name'] STATE CASCADE CONSTRAINTS;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接