数据库操作(CREATE/ALTER/DROP DATABASE)
本教程共 50 篇 · 第 6 篇 · 更新于 2026-07-31 · 约 7 分钟阅读
6. 数据库操作(CREATE/ALTER/DROP DATABASE)
本节目标:学完你能完整地对数据库做建、改、删三件事,并知道删库前该注意什么。
上一章我们只建了一个库。这一章把数据库的常见操作讲全:创建、修改、删除,以及怎么随时查看库列表。
创建数据库
基础语法:
CREATE DATABASE dbname;
建库时还能顺带指定一些选项。比如指定字符编码和排序规则:
CREATE DATABASE mydb
WITH ENCODING = 'UTF8'
LC_COLLATE = 'C'
LC_CTYPE = 'C';
Note日常开发中 UTF8 编码是默认且最推荐的选择,能正确存中文。不指定时也通常是 UTF8,所以大多数情况直接
CREATE DATABASE 名字就行。排序规则(Collation)影响「字符串怎么比较大小、怎么排序」,中文一般选C或zh_CN.UTF-8,这块进阶再深究。
createdb 命令行工具是这条语句的封装,前面已经用过,这里不再重复。
Tip想建库时顺手带个注释,方便以后回忆这库干啥用的,可以这样:先建库,再执行
COMMENT ON DATABASE mydb IS '用户与订单练习库';。用\l+就能看到注释。
修改数据库
库建好之后,也能改它的属性。用 ALTER DATABASE。
改数据库属主(owner):
ALTER DATABASE mydb OWNER TO new_owner;
属主就是库的主人,只有属主或超级用户才能改库、删库。把库转给别人时用得上。
改数据库名字:
ALTER DATABASE mydb RENAME TO mydb_new;
Warning改名时,不能有其他会话正连着这个库。否则会报「数据库正在被使用」。先让连着的人断开,或用
\c切到别的库再操作。改完名后,别人连接字符串里的库名也得跟着改,别漏了。
改默认配置参数(了解即可):
ALTER DATABASE mydb SET work_mem = '16MB';
这会给连这个库的所有会话设置一个默认参数,属于进阶用法,先有个印象。比如你有个库专门跑大查询,就把 work_mem 调大,不影响别的库。
删除数据库
删除用 DROP DATABASE。这是危险操作,一旦删除,库里的所有表和数据都物理消失,无法恢复。
基本语法:
DROP DATABASE mydb;
只有超级用户或库属主能删。如果库不存在,直接这么写会报错。为避免报错,可以用 IF EXISTS:
DROP DATABASE IF EXISTS mydb;
库不存在时,它只给个提示而不报错。这在写脚本时很实用。
对应的命令行工具是 dropdb:
dropdb mydb
Warning删库前务必三思。删库不能回滚,也没有「回收站」。我之前就见过有人在生产环境手滑删了库,后果很严重。养成习惯:删之前先确认库名、确认连的是不是对的服务器。一个保险做法是删之前先
\c切到别的库,并SELECT current_database();确认当前位置。
还有一点:不能删除当前正连接的库。要先 \c 切到别的库(比如 postgres),再执行删除。
Note为什么不能删当前库?因为你正连着它,服务器没法在「自己被用着」的时候把自己删掉。切到别的库就等于「从要删的库里退出来」,删起来就安全了。
查看数据库列表
随时想看有哪些库,在 psql 里用元命令:
\l
想看更详细的信息(比如大小、注释、连接数限制),可以加 +:
\l+
如果只想用 SQL 查,也可以查系统视图:
SELECT datname FROM pg_database;
Tip
pg_database是 Postgres 的系统目录视图,存着所有库的信息。这类以pg_开头的视图,后面你会经常用到。比如想看库的大小,可以查pg_database_size('mydb')。
顺手记几个相关查询:
-- 当前库大小(带单位)
SELECT pg_size_pretty(pg_database_size('mydb'));
-- 所有库大小排个序
SELECT datname, pg_size_pretty(pg_database_size(datname))
FROM pg_database
ORDER BY pg_database_size(datname) DESC;
一张操作速查表
| 操作 | SQL 语句 | 命令行 |
|---|---|---|
| 建库 | CREATE DATABASE 名; | createdb 名 |
| 改名 | ALTER DATABASE 旧 RENAME TO 新; | — |
| 改属主 | ALTER DATABASE 名 OWNER TO 用户; | — |
| 删库 | DROP DATABASE 名; | dropdb 名 |
| 看列表 | \l / \l+ | — |
小结
数据库的操作就是增删改查四类:建用 CREATE DATABASE,改属主/改名用 ALTER DATABASE,删用 DROP DATABASE(记得 IF EXISTS 和「别删当前库」)。
快速复制一个库(克隆)
开发时常常想要「照着现有库,复制一份随便改」。用模板语法就能做:
CREATE DATABASE mydb_copy
WITH TEMPLATE = mydb;
这条会按 mydb 的当前状态(表、数据都算)复制出 mydb_copy。注意:源库不能有人连着,否则复制会失败,先让大家退出来再操作。
Tip克隆库是做实验的好办法:复制一份,随便折腾、删表、灌脏数据,搞坏了删掉重克隆,不影响原库。比反复手写建表语句省事。
模板库再说明
前面提过新库默认以 template1 为模板。其实你还能拿任意库当模板(上面克隆就是这么干的)。系统自带的 template0 是「最干净」的模板,排序规则等最基础,某些特殊编码需求会指定它。
普通情况下你不用管这些,CREATE DATABASE 名; 足够。知道「模板机制存在」即可,需要时再查。
删库的常见误区
- 一次只能删一个:
DROP DATABASE后面跟一个库名,不能写一串。要删多个,就分几条语句写。 - 删库不能加 CASCADE 之外的「条件」:没有「删前确认里面有空」这种语法,危险操作全靠你自己先确认。
- 删库不等于删用户:库没了,里面数据的属主用户还在,可以留着给别的库用。
Note有些图形工具删库前会弹窗让你二次确认,命令行则一言不合就执行。所以命令行删库前,我习惯先
\l看一眼库名、SELECT current_database();确认自己在哪,再动手。多这十秒钟,少半夜救火。
小结补充:库操作的边界
库这一层能做的就这些:建、改名、改属主、设参数、删。更细的「表、数据」操作在库里面进行,那是后面章节的主角。把库的增删改管熟,你的 Postgres 环境就稳了。
改名后要同步的地方
库改名看着简单,但有几个地方容易忘同步:连接字符串里的库名、应用配置、定时任务脚本。改名前最好全局搜一下哪里写死了旧库名,统一改掉,不然运行时连不上还一头雾水。
Note相比之下,改属主(
OWNER TO)一般不影响连接,因为连接用的是角色名而非库名。两者影响范围不同,别混淆。改名影响「连哪」,改属主影响「谁有权管」。
下一章我们进入一个容易被忽略但很重要的概念:模式(Schema)。