DROP TABLE

说明

删除表定义及该表的所有数据、索引、触发器、约束和权限规范。

语法

drop_table ::=

参数

table_name

是要删除的表名。

RESTRICT|CASCADE

  • RESTRICT确保只有不存在完整性约束的表才可以被删除。
  • CASCADE任何引用的视图或完整性约束都将被删除。

默认为RESTRICT

IF EXISTS

当存在一个同名的关系时会删除表,否则不会删除表,且会打印NOTICE提示信息

注解

除去表时,表上的规则或默认值将解除绑定,任何与表关联的约束或触发器将自动除去。如果重新创建表,必须重新绑定适当的规则和默认值,重新创建任何触发器并添加必要的约束。

在系统表上不能使用 DROP TABLE 语句。

删除临时表时需要临时表没有与其他会话绑定,删除临时表时会同步删除该临时表的实例和索引等。特别的,当某个会话使用delete语句删除表中数据或使用insert into…select…from 一个空表时,其他会话也不能删除该临时表;但是当某个会话使用truncate截断临时表时,其他会话可以删除临时表。

示例

示例1: 删除表

--  清理环境
DROP TABLE tab1 CASCADE;

--  创建表
CREATE TABLE tab1 (a INT, b INT);

--  删除表
DROP TABLE tab1;  

示例2: 删除表(依赖此表的视图被置为无效)

--  清理环境
DROP VIEW view2 CASCADE;
DROP TABLE tab2 CASCADE;

--  创建表
CREATE TABLE tab2 (a INT PRIMARY KEY, b INT);

--  创建视图
CREATE VIEW view2 AS SELECT * FROM tab2 ORDER BY a;

--  删除表(依赖此表的视图被置为无效)
DROP TABLE tab2;

--  视图已被置为无效
SELECT * FROM view2;
ERROR, view: VIEW2 is invalid

示例3: 删除表(使用 RESTRICT -- 依赖此表的视图被置为无效)

--  清理环境
DROP VIEW view3 CASCADE;
DROP TABLE tab3 CASCADE;

--  创建表
CREATE TABLE tab3 (a INT PRIMARY KEY, b INT);

--  创建视图
CREATE VIEW view3 AS SELECT * FROM tab3 ORDER BY a;

--  删除表(使用 RESTRICT -- 依赖此表的视图被置为无效)
DROP TABLE tab3 RESTRICT;

--  视图已被置为无效
SELECT * FROM view3;
ERROR, view: VIEW3 is invalid

示例4: 删除表(使用 CASCADE -- 级联删除依赖此表的视图)

--  清理环境
DROP VIEW view4 CASCADE;
DROP TABLE tab4 CASCADE;

--  创建表
CREATE TABLE tab4 (a INT PRIMARY KEY, b INT);

--  创建视图
CREATE VIEW view4 AS SELECT * FROM tab4 ORDER BY a;

--  删除表(使用 CASCADE -- 级联删除依赖此表的视图)
DROP TABLE tab4 CASCADE;

--  视图已被级联删除
SELECT * FROM view4;
ERROR, Relation "VIEW4" does not exist

示例5: 删除表(使用 IF EXISTS)

--  清理环境
DROP TABLE tab5 CASCADE;

-- 删除表tab5(不会删除并且不报错)
DROP TABLE IF EXISTS tab5;

示例6: 删除表(使用 RESTRICT -- 表中存在约束)

-- 清理环境
DROP TABLE tab6 CASCADE;
DROP TABLE tab7 CASCADE;

-- 创建表
CREATE TABLE tab6 (a INT PRIMARY KEY, b INT);
CREATE TABLE tab7 (a INT PRIMARY KEY, b INT FOREIGN KEY REFERENCES tab6(a));

-- 存在约束,删除失败(若要删除使用CASCADE)
DROP TABLE tab6;
ERROR, 对象依赖无法删除用DROP ... CASCADE删除, Cannot drop table SYSDBA.TAB6 because other objects depend on it
	Use DROP ... CASCADE to drop the dependent objects too


DROP TABLE tab6 CASCADE;
DROP TABLE tab7 CASCADE;