首页 / PostgreSQL 入门教程 / 数据库操作(CREATE/ALTER/DROP DATABASE)

PostgreSQL 入门教程

数据库操作(CREATE/ALTER/DROP DATABASE)

本教程共 50 篇 · 第 6 篇 · 更新于 2026-07-31 · 约 7 分钟阅读

PostgreSQLPostgreSQL 入门教程CREATE DATABASEALTER DATABASEDROP DATABASE数据库管理

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)影响「字符串怎么比较大小、怎么排序」,中文一般选 Czh_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)。