Skip to content

SQLite - 删除表

SQLite 的 DROP TABLE 语句用于彻底删除表的定义、所有数据以及相关的对象,如索引、触发器和约束。这是一个破坏性且不可逆的操作。

使用此命令时务必极其小心。一旦表被删除,其中包含的所有信息将永久丢失,除非您有备份。

DROP TABLE 的基本语法很简单。现代的最佳实践是包含 IF EXISTS 子句,这可以防止在表不存在时报错。这在自动化脚本中特别有用。

-- 推荐语法
DROP TABLE IF EXISTS table_name;
-- 基本语法
DROP TABLE table_name;

让我们考虑一个更真实的场景:有两个表 DEPARTMENTS 和 EMPLOYEES,其中 EMPLOYEES 表含有一个引用 DEPARTMENTS 表的外键(foreign key)。

-- 首先,我们创建表并启用外键约束。
PRAGMA foreign_keys = ON;
CREATE TABLE DEPARTMENTS (
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL
);
CREATE TABLE EMPLOYEES (
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
DEPT_ID INT NOT NULL,
FOREIGN KEY (DEPT_ID) REFERENCES DEPARTMENTS(ID)
);
-- 验证表是否已创建
sqlite> .tables
DEPARTMENTS EMPLOYEES

现在,如果我们尝试首先删除 DEPARTMENTS 表,SQLite 会(正确地)不允许这样做,因为 EMPLOYEES 表依赖于它。

sqlite> DROP TABLE DEPARTMENTS;
Error: foreign key constraint failed

要成功删除,您必须先删除依赖表 (EMPLOYEES),然后才能删除父表 (DEPARTMENTS)。

sqlite> DROP TABLE EMPLOYEES;
sqlite> DROP TABLE DEPARTMENTS;

现在,检查表将显示它们已成功删除。

sqlite> .tables
sqlite>
  • 使用 IF EXISTS:在脚本中始终使用 DROP TABLE IF EXISTS ... 以使其幂等(可多次运行而不会引发错误)。
  • 先备份:在生产或重要的开发环境中删除任何表之前,请务必创建数据库备份。
  • 使用事务:对于多步模式更改,请将 DROP TABLE 和其他语句包装在事务(transaction)中。这允许您在某一步失败时 ROLLBACK(回滚)所有更改。
  • 理解依赖关系:请注意引用您要删除的表的外键、视图(view)和触发器(trigger)。您必须首先删除这些依赖关系。