用Oracle SQL删除表

问题描述 投票:2回答:4

每当我试图删除表或创建表则显示这些错误:

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

任何人都可以解释为什么出现这种情况?

sql oracle foreign-keys
4个回答
9
投票

如果你真的确定要删除该表,即使它在国外的键,你可以迫使它像这才是引用:

drop table state cascade constraints;

正如我们所料,这句法在the Oracle SQL Reference定义。

请注意,这将丢弃所有的外键关系。所以,你需要重新创建他们你已经重建表(和它的主键)之后。通常情况下,因为最常见的使用情况下,捣毁和重新产生在开发或CI环境模式,这是好的。

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

  1. 丢弃表之前显式删除外键约束,无论是使用脚本或使用动态SQL。
  2. 订购DROP TABLE语句,这样依赖表第一轮回一圈,用自己讨厌的外键一起。易够表,更痛苦的大架构的屈指可数。

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

0
投票

郊区表为任何其他表首先你放弃孩子,这时你可以删除SUBURB表父表....

而一个名为状态表是在数据库中已存在...所以你不能创建具有相同名称的表格....一次,如果你放弃你可以创建另一个状态表....


0
投票

下面是对我罚款,甲骨文样本数据库工程解决方案:

DROP TABLE ['Your_Table_Name'] STATE CASCADE CONSTRAINTS;
© www.soinside.com 2019 - 2024. All rights reserved.