在Oracle SQL中删除表

时间:2015-08-30 02:20:54

标签: sql oracle foreign-keys

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

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

有人可以解释为什么会这样吗?

5 个答案:

答案 0 :(得分:9)

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

drop table state cascade constraints;

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

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

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

  1. 在删除之前显式删除外键约束 表,使用脚本或使用动态SQL。
  2. 订购DROP TABLE语句,以便依赖表依赖于表 用他们讨厌的外键。足够容易一把桌子, 使用大型架构会更痛苦。

答案 1 :(得分: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

答案 2 :(得分:1)

如果创建主键并创建外键,则不能删除表 你以这种方式删除表格,例如,如果你有学生或老师的表格,你想删除这个表格,你应该写

DROP TABLE students CASCADE CONSTRAINTS; 

你也丢掉老师的桌子

DROP TABLE teachers CASCADE CONSTRAINTS;

答案 3 :(得分:0)

<强> 郊区 表是任何其他表的父表首先删除子表然后删除<configuration> 表....

您的数据库中已存在一个名为 STATE 的表格...因此您无法创建具有相同名称的表格....如果您放弃了您可以在 STATE 表中创建另一个....

答案 4 :(得分:0)

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

DROP TABLE ['Your_Table_Name'] STATE CASCADE CONSTRAINTS;