DROP
语句移除先前使用 CREATE
命令添加的目录条目。
Examples
删除名为 tbl
的表:
DROP TABLE tbl;
删除名为 v1
的视图;如果视图不存在,不要抛出错误:
DROP VIEW IF EXISTS v1;
删除函数 fn
:
DROP FUNCTION fn;
删除索引 idx
:
DROP INDEX idx;
删除模式 sch
:
DROP SCHEMA sch;
删除序列 seq
:
DROP SEQUENCE seq;
删除宏 mcr
:
DROP MACRO mcr;
删除宏表 mt
:
DROP MACRO TABLE mt;
删除类型 typ
:
DROP TYPE typ;
Syntax
被删除对象的依赖关系
DuckDB 对某些对象类型执行有限的依赖跟踪。
默认情况下或如果提供了 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.
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 |
Limitations
视图依赖
目前,视图的依赖关系没有被跟踪。例如,如果创建了一个引用表的视图,并且该表被删除,那么视图将处于无效状态:
CREATE TABLE tbl (i INTEGER);
CREATE VIEW v AS
SELECT i FROM tbl;
DROP TABLE tbl RESTRICT;
SELECT * FROM v;
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;
有关删除表后回收空间的说明,请参阅“回收空间”页面。