跳到主要内容

DROP 语句

DROP 语句用于删除先前通过 CREATE 命令添加的目录条目。

示例

删除名为 tbl 的表:

DROP TABLE tbl;

删除名为 view1 的视图;若视图不存在则不抛出错误:

DROP VIEW IF EXISTS view1;

删除函数 fn

DROP FUNCTION fn;

删除索引 idx

DROP INDEX idx;

删除 schema sch

DROP SCHEMA sch;

删除序列 seq

DROP SEQUENCE seq;

删除宏 mcr

DROP MACRO mcr;

删除宏表 mt

DROP MACRO TABLE mt; -- 自 v1.4.0 起,`TABLE` 可选

删除类型 typ

DROP TYPE typ;

语法

被删除对象的依赖关系

Goose 会对某些对象类型进行有限的依赖跟踪。 默认情况下,或在提供 RESTRICT 子句时,如果存在依赖该条目的其他对象,则不会删除该条目。 如果提供 CASCADE 子句,则依赖该对象的所有对象也会被一并删除。

CREATE SCHEMA myschema;
CREATE TABLE myschema.t1 (i INTEGER);
DROP SCHEMA myschema;
Dependency Error:
Cannot drop entry "myschema" because there are entries that depend on it.
table "t1" depends on schema "myschema".
Use DROP...CASCADE to drop all dependents.

CASCADE 修饰符会同时删除 myschema 和 myschema.t1

CREATE SCHEMA myschema;
CREATE TABLE myschema.t1 (i INTEGER);
DROP SCHEMA myschema CASCADE;

以下依赖关系会被跟踪,因此当用户在未使用 CASCADE 修饰符时尝试删除被依赖对象,会触发错误。

被依赖对象类型依赖对象类型
SCHEMAFUNCTION
SCHEMAINDEX
SCHEMAMACRO TABLE
SCHEMAMACRO
SCHEMASCHEMA
SCHEMASEQUENCE
SCHEMATABLE
SCHEMATYPE
SCHEMAVIEW
TABLEINDEX

限制

对视图的依赖

目前不会跟踪视图的依赖关系。例如,如果创建了一个引用某表的视图,而该表随后被删除,则该视图将处于无效状态:

CREATE TABLE tbl (i INTEGER);
CREATE VIEW view1 AS
SELECT i FROM tbl;
DROP TABLE tbl RESTRICT;
SELECT * FROM view1;

这会返回如下错误信息:

Catalog Error:
Table with name tbl does not exist!

回收磁盘空间的限制

执行 DROP TABLE 通常会释放表所占用的内存,但不一定会释放磁盘空间。 即使磁盘占用未下降,空闲块也会被标记为 free。 例如,如果我们有一个 2 GB 的文件并删除了一个 1 GB 的表,文件大小可能仍为 2 GB,但其中应包含 1 GB 的空闲块。 要检查这一点,请使用以下 PRAGMA 并查看输出中的 free_blocks 数量:

PRAGMA database_size;

有关删除表后如何回收空间,请参阅“Reclaiming space” 页面