在 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:名称已被现有对象使用
谁能解释为什么会这样?
【问题讨论】:
您必须按正确的顺序放置。如果TABLEA
与TABLEB
有外键关系,则不能删除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 中删除表的主要内容,如果未能解决你的问题,请参考以下文章
如果 sql 语句中存在表,则从 oracle 数据库中删除表 [重复]