PostgreSQL 删除表格 (DROP TABLE)
在 PostgreSQL 中,可以使用 DROP TABLE 语句来删除(移除)一个或多个表。如果一个表不再需要,或者想要清理数据库结构,可以使用该语句。
1. DROP TABLE 语法
DROP TABLE table_name;
table_name:要删除的表名。
示例:
DROP TABLE employees;
这将删除 employees 表及其所有数据。
2. 防止错误的 DROP TABLE IF EXISTS
如果表不存在,直接 DROP TABLE 会导致错误。可以使用 IF EXISTS 选项,防止错误发生:
DROP TABLE IF EXISTS employees;
这样,如果 employees 表不存在,PostgreSQL 也不会报错。
3. 删除多个表
可以一次删除多个表:
DROP TABLE employees, departments;
这样会同时删除 employees 和 departments 两个表。
4. CASCADE 选项(级联删除)
如果表与其他表有外键关联,默认情况下不能直接删除,必须使用 CASCADE:
DROP TABLE employees CASCADE;
CASCADE选项会删除employees表,并删除所有依赖于它的对象(如外键关联的表)。
示例:
CREATE TABLE departments (
dept_id SERIAL PRIMARY KEY,
dept_name VARCHAR(100) NOT NULL
);
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
dept_id INT REFERENCES departments(dept_id) ON DELETE CASCADE
);
如果尝试:
DROP TABLE departments;
会报错:
ERROR: cannot drop table "departments" because other objects depend on it
DETAIL: Table "employees" references "departments".
正确的方式是:
DROP TABLE departments CASCADE;
这样 employees 也会被删除。
5. RESTRICT 选项(默认行为)
如果不希望自动删除依赖对象,可以显式使用 RESTRICT:
DROP TABLE employees RESTRICT;
RESTRICT选项会阻止删除表,若其他表依赖它,PostgreSQL 会报错。- 这也是
DROP TABLE默认行为。
6. 删除表但保留数据结构
有时想要删除表中所有数据,但保留表结构,可以使用 TRUNCATE:
TRUNCATE TABLE employees;
或者:
TRUNCATE TABLE employees RESTART IDENTITY;
RESTART IDENTITY选项会重置SERIAL生成的自增 ID。
7. DROP TABLE 之后如何恢复?
DROP TABLE 直接删除表,无法撤销。但可以使用 事务回滚(如果在事务中执行):
BEGIN;
DROP TABLE employees;
ROLLBACK; -- 撤销删除
如果事务未提交,则可以恢复,否则数据将永久丢失。
8. 总结
| 语法 | 作用 |
|---|---|
DROP TABLE table_name; | 删除表 |
DROP TABLE IF EXISTS table_name; | 仅在表存在时删除,防止错误 |
DROP TABLE table1, table2; | 删除多个表 |
DROP TABLE table_name CASCADE; | 级联删除所有相关对象 |
DROP TABLE table_name RESTRICT; | 若存在依赖对象,则阻止删除(默认行为) |
TRUNCATE TABLE table_name; | 清空表但保留结构 |
更多详细内容请关注其他相关文章!