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 修饰符时尝试删除被依赖对象,会触发错误。
| 被依赖对象类型 | 依赖对象类型 |
|---|---|
SCHEMA | FUNCTION |
SCHEMA | INDEX |
SCHEMA | MACRO TABLE |
SCHEMA | MACRO |
SCHEMA | SCHEMA |
SCHEMA | SEQUENCE |
SCHEMA | TABLE |
SCHEMA | TYPE |
SCHEMA | VIEW |
TABLE | INDEX |
限制
对视图的依赖
目前不会跟踪视图的依赖关系。例如,如果创建了一个引用某表的视图,而该表随后被删除,则该视图将处于无效状态:
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” 页面。