PostgreSQL中initdb与createdb命令的区别是什么?
PostgreSQL 创建数据库的两种方式:一次搞懂!
嘿,刚接触PostgreSQL的时候我也对这几个操作懵圈过,给你拆解清楚它们的分工和区别:
先搞明白:initdb 不是创建单个数据库!
你第一次运行的 initdb /usr/local/var/postgres 是初始化整个PostgreSQL数据库集群的命令,这是安装完成后的一次性操作:
- 它会创建一个存储所有数据库、系统表、配置文件的目录(就是你指定的
/usr/local/var/postgres) - 自动生成默认的
postgres数据库(这就是你在列表里看到的那个),还有模板库template0、template1 - 简单说,
initdb是给PostgreSQL搭好整个“服务器框架”,没有这一步,连数据库都没法创建
两种创建单个数据库的方式
当集群初始化完成后,你就可以用下面两种方式创建自己的数据库了:
1. 命令行工具:createdb
这是PostgreSQL提供的命令行脚本,本质是对SQL命令的封装,不用进入psql交互环境就能直接用:
- 基础用法:
createdb my_new_db,直接创建名为my_new_db的数据库 - 带参数的用法:比如指定创建数据库的用户,
createdb -U my_username my_new_db;或者指定编码,createdb -E UTF8 my_new_db - 如果你尝试用它创建
postgres数据库,会报错,因为这个库已经被initdb自动创建了
2. SQL命令:CREATE DATABASE
这个需要先进入psql交互环境(比如先执行psql postgres连接到默认库),然后执行SQL语句:
- 基础用法:
CREATE DATABASE my_new_db;(注意结尾的分号) - 更灵活的配置:比如设置编码、表空间,
CREATE DATABASE my_new_db ENCODING 'UTF8' TABLESPACE my_custom_tablespace; - 和
createdb一样,重复创建postgres也会提示“数据库已存在”
总结一下
initdb:搭全局框架,只跑一次createdb:命令行快捷方式,适合快速建库CREATE DATABASE:SQL原生命令,适合需要精细配置的场景
内容的提问来源于stack exchange,提问作者Robin Wieruch




