CodeGym /课程 /SQL SELF /使用 DROP TABLE 删除表

使用 DROP TABLE 删除表

SQL SELF
第 18 级 , 课程 2
可用

现在我们来聊聊怎么用 DROP TABLE 命令正确地从数据库里删表。

DROP TABLE 这命令能把数据库里的表连数据带结构一起删掉。想象一下你写了个毕业设计,结果一不小心把它和笔记本一起烧了,这就跟用 DROP TABLE 差不多。是不是有点吓人?别怕,最重要的是搞清楚它怎么用,然后小心点就行!

DROP TABLE 的特点:

  • 会把 整个表(还有里面的数据)都删掉,没法恢复(除非你提前备份了)。
  • 彻底释放表在磁盘上占的空间。
  • 相关的索引、约束、触发器也会一起被删。

DROP TABLE 命令的语法

DROP TABLE 命令的语法很简单明了:

DROP TABLE 表名;

这里:

  • 表名 —— 你想删掉的表的名字。

删除表的简单例子

来看个例子。假设我们有个表叫 students

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER CHECK (age > 0)
);

如果这个表你不需要了,可以用下面的命令删掉:

DROP TABLE students;

执行完这条命令后,students 这个表会从数据库里彻底消失,所有学生的数据也都没了(如果之前有的话)。

删除多个表

你也可以一次性删掉多个表,只要用逗号把它们隔开就行:

DROP TABLE table1, table2, table3;

举个例子:

DROP TABLE students, teachers, courses;

这条命令会同时删掉 studentsteacherscourses 这三个表。

使用 IF EXISTS

如果你试图删一个 不存在的表DROP TABLE 会报错。为了避免这种报错,可以加上 IF EXISTS 选项:

DROP TABLE IF EXISTS table_name;

比如:

DROP TABLE IF EXISTS students;

如果 students 这个表存在,它就会被删掉;如果不存在,命令也不会报错,只会给个警告。

考虑依赖关系删除表

有时候删表会遇到麻烦,比如有别的表或者对象依赖它。比如说,这个表有外键跟别的表关联。外键的细节我下节课再讲 :P

假设你有两个表:studentsenrollmentsenrollments 依赖 students,因为它有个外键指向 students

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

CREATE TABLE enrollments (
    id SERIAL PRIMARY KEY,
    student_id INTEGER REFERENCES students(id), -- 列 student_id 指向 students.id
    course_name VARCHAR(100)
);

如果你直接删 students 这个表,而没先删 enrollments,就会报错:

DROP TABLE students;
-- 错误:  不能删除表 "students",因为有其他对象依赖它
-- 详情:  enrollments_student_id_fkey 约束在表 enrollments 上依赖表 students

要想把表和所有依赖它的对象一起删掉,可以用 CASCADE 选项:

DROP TABLE students CASCADE;

这条命令会删掉 students,同时自动把所有依赖它的对象也删了(比如这里的 enrollments 表)。

不过用 CASCADE 要小心,因为它可能会删掉比你想象中更多的东西。想知道会删啥,可以先用 CASCADE,然后去查查日志 :)

不删依赖对象的情况下删表

如果你想防止误删相关对象,可以用 RESTRICT 选项。这个选项会禁止删掉有依赖的表:

DROP TABLE students RESTRICT;

如果表有依赖对象,命令会报错,删除操作会被取消。

临时表和它们的删除

临时表(用 CREATE TEMP TABLE 创建的)在数据库会话结束时会自动被删掉。不过你也可以在会话里手动用 DROP TABLE 删掉它。

比如:

CREATE TEMP TABLE temp_data (
    id SERIAL PRIMARY KEY,
    value TEXT
);

DROP TABLE temp_data;

DROP TABLE 时常见的坑

试图删不存在的表。 为了避免报错,记得用 IF EXISTS

DROP TABLE IF EXISTS non_existing_table;

删有依赖的表但没用 CASCADE 如果有别的表跟你要删的表有关联,命令会报错。确定要删所有依赖时再用 CASCADE

DROP TABLE students CASCADE;

滥用 CASCADE 这样可能会把很重要的对象都删了。用 CASCADE 前一定要搞清楚会影响哪些对象。

手滑误删表。 尤其是在生产环境,删之前一定要再三确认你删的是啥。

一些有用的建议,有的还挺正经的

建议1:一切都否认

删痕迹要比删数据快。
然后自信地说:“日志里那是异常,我已经修好了。”

装作这是个 feature。
“我们在做容错压力测试……嗯,系统没扛住。但现在知道该怎么改进了!”

宣布紧急疏散:“我们有 production 级别的事故。”
当大家都在慌乱奔跑时,没人有空问是谁点了 DELETE FROM 没加 WHERE

把简历挂到 hh.ru,职位写 DBA。
你现在真的离数据库更近了,尤其是那些已经不存在的数据库。

提前安排咖啡时间。
因为过一会儿可能有人建议你“从项目里休息一下……永远的那种”。

装作这是 staging 环境。
“你确定这不是测试环境吗?我们不是在测试啥吗……大概吧……”

坐在 open space 正中间。
没人会信肇事者敢坐得这么显眼。

甩锅给 ChatGPT。
都是 AI 的锅。你看,它还没法替代你。老板,别开我啊。

建议2:怎么带着黑历史找工作

  • 一次性把所有表都删了。这样老板忙着救火,没空单独开除你。

  • 没人会单独背锅。如果能拉上领导一起——就没人会给你差评了。

  • 连客户数据都删了?恭喜,公司现在有比你被开除更大的麻烦。

建议3:删表前一定要备份

好了,下面说点正经的。

在删表之前(尤其是有重要数据的表),一定要用 pg_dump 命令先备份一下。这样万一手滑删错了还能恢复。

备份命令示例:

pg_dump -U username -d database_name -t table_name > table_backup.sql

到这里你已经掌握了 DROP TABLE 的基本用法。把这颗“核按钮”收好,只有你真的确定要删的时候再用。下节课我们会继续学怎么改表结构和数据库里的其他对象。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION