在 Oracle SQL 中删除表

Posted

技术标签:

【中文标题】在 Oracle SQL 中删除表【英文标题】:Dropping a table in Oracle SQL 【发布时间】:2015-08-30 02:20:53 【问题描述】:

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

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:名称已被现有对象使用

谁能解释为什么会这样?

【问题讨论】:

您必须按正确的顺序放置。如果TABLEATABLEB 有外键关系,则不能删除TABLEB,因为它违反了TABLEA 中的外键关系。您必须先删除TABLEA,然后才能删除TABLEB 尝试一个一个地执行 drop,这样你就可以看到是哪一个导致了错误。 你也可以使用 DROP TABLE STATE CASCADE CONSTRAINTS;但请注意,它将删除链接表状态的外键约束。 我厌倦了按以下顺序删除所有表,但它无法运行 我们不能没有级联约束@Vini.g.fer 【参考方案1】:

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

drop table state cascade constraints;

此语法在the Oracle SQL Reference 中定义。

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

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

    在删除外键约束之前显式删除外键约束 使用脚本或使用动态 SQL 的表。 订购 DROP TABLE 语句,以便依赖表首先被 zapped 用他们讨厌的外键。几张桌子很容易, 大型架构更痛苦。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

如果您创建了主键并同时创建了外键,那么您将无法删除该表 你以这种方式删除表格,例如,如果你有学生或教师表格,你想删除这个表格,你应该写

DROP TABLE students CASCADE CONSTRAINTS; 

你也把教师表丢了

DROP TABLE teachers CASCADE CONSTRAINTS;

【讨论】:

【参考方案4】:

郊区 表是任何其他表的父表首先您删除子表然后您可以删除SUBURB 表....

并且名为 STATE 的表已经存在于您的数据库中...因此您无法创建具有相同名称的表...如果您删除STATE 表,您可以创建另一个....

【讨论】:

【参考方案5】:

这是在 Oracle 示例数据库中适合我的解决方案:

DROP TABLE ['Your_Table_Name'] STATE CASCADE CONSTRAINTS;

【讨论】:

以上是关于在 Oracle SQL 中删除表的主要内容,如果未能解决你的问题,请参考以下文章

oracle中如何删除所有表

如果 sql 语句中存在表,则从 oracle 数据库中删除表 [重复]

Oracle中,多表关联删除该怎么写?

oracle删除某个表的索引的sql语句

在SQL中,如何用ALTER命令删除表中所有完整性约束,然后再用ALTER命令建立

oracle删除表数据的两种的方式