自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选。
本文介绍PostgreSQL的安装和基本用法,供初次使用者上手。以下内容基于Debian操作系统,其他操作系统实在没有精力兼顾,但是大部分内容应该普遍适用。
一、安装
首先,安装PostgreSQL客户端。
sudo apt-get install postgresql-client
然后,安装PostgreSQL服务器。
sudo apt-get install postgresql
正常情况下,安装完成后,PostgreSQL服务器会自动在本机的5432端口开启。
如果还想安装图形管理界面,可以运行下面命令,但是本文不涉及这方面内容。
sudo apt-get install pgadmin3
二、添加新用户和新数据库
初次安装后,默认生成一个名为postgres的数据库和一个名为postgres的数据库用户。这里需要注意的是,同时还生成了一个名为postgres的Linux系统用户。
下面,qy88千-赢-国-际-网-页-手-机-登-录使用postgres用户,来生成其他用户和新数据库。好几种方法可以达到这个目的,这里介绍两种。
第一种方法,使用PostgreSQL控制台。
首先,新建一个Linux新用户,可以取你想要的名字,这里为dbuser。
sudo adduser dbuser
然后,切换到postgres用户。
sudo su - postgres
下一步,使用psql命令登录PostgreSQL控制台。
psql
这时相当于系统用户postgres以同名数据库用户的身份,登录数据库,这是不用输入密码的。如果一切正常,系统提示符会变为"postgres=#",表示这时已经进入了数据库控制台。以下的命令都在控制台内完成。
第一件事是使用\password命令,为postgres用户设置一个密码。
\password postgres
第二件事是创建数据库用户dbuser(刚才创建的是Linux系统用户),并设置密码。
CREATE USER dbuser WITH PASSWORD 'password';
第三件事是创建用户数据库,这里为exampledb,并指定所有者为dbuser。
CREATE DATABASE exampledb OWNER dbuser;
第四件事是将exampledb数据库的所有权限都赋予dbuser,否则dbuser只能登录控制台,没有任何数据库操作权限。
GRANT ALL PRIVILEGES ON DATABASE exampledb to dbuser;
最后,使用\q命令退出控制台(也可以直接按ctrl+D)。
\q
第二种方法,使用shell命令行。
添加新用户和新数据库,除了在PostgreSQL控制台内,还可以在shell命令行下完成。这是因为PostgreSQL提供了命令行程序createuser和createdb?;故且孕陆ㄓ没buser和数据库exampledb为例。
首先,创建数据库用户dbuser,并指定其为超级用户。
sudo -u postgres createuser --superuser dbuser
然后,登录数据库控制台,设置dbuser用户的密码,完成后退出控制台。
sudo -u postgres psql
\password dbuser
\q
接着,在shell命令行下,创建数据库exampledb,并指定所有者为dbuser。
sudo -u postgres createdb -O dbuser exampledb
三、登录数据库
添加新用户和新数据库以后,就要以新用户的名义登录数据库,这时使用的是psql命令。
psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432
上面命令的参数含义如下:-U指定用户,-d指定数据库,-h指定服务器,-p指定端口。
输入上面命令以后,系统会提示输入dbuser用户的密码。输入正确,就可以登录控制台了。
psql命令存在简写形式。如果当前Linux系统用户,同时也是PostgreSQL用户,则可以省略用户名(-U参数的部分)。举例来说,我的Linux系统用户名为ruanyf,且PostgreSQL数据库存在同名用户,则我以ruanyf身份登录Linux系统后,可以直接使用下面的命令登录数据库,且不需要密码。
psql exampledb
此时,如果PostgreSQL内部还存在与当前系统用户同名的数据库,则连数据库名都可以省略。比如,假定存在一个叫做ruanyf的数据库,则直接键入psql就可以登录该数据库。
psql
另外,如果要恢复外部数据,可以使用下面的命令。
psql exampledb < exampledb.sql
四、控制台命令
除了前面已经用到的\password命令(设置密码)和\q命令(退出)以外,控制台还提供一系列其他命令。
- \h:查看SQL命令的解释,比如\h select。
- \?:查看psql命令列表。
- \l:列出所有数据库。
- \c [database_name]:连接其他数据库。
- \d:列出当前数据库的所有表格。
- \d [table_name]:列出某一张表格的结构。
- \du:列出所有用户。
- \e:打开文本编辑器。
- \conninfo:列出当前数据库和连接的信息。
五、数据库操作
基本的数据库操作,就是使用一般的SQL语言。
# 创建新表
CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);# 插入数据
INSERT INTO user_tbl(name, signup_date) VALUES('张三', '2013-12-22');# 选择记录
SELECT * FROM user_tbl;# 更新数据
UPDATE user_tbl set name = '李四' WHERE name = '张三';# 删除记录
DELETE FROM user_tbl WHERE name = '李四' ;# 添加栏位
ALTER TABLE user_tbl ADD email VARCHAR(40);# 更新结构
ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL;# 更名栏位
ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup;# 删除栏位
ALTER TABLE user_tbl DROP COLUMN email;# 表格更名
ALTER TABLE user_tbl RENAME TO backup_tbl;# 删除表格
DROP TABLE IF EXISTS backup_tbl;
(完)
bob 说:
PostgreSQL要崛起啊,qy88千-赢-国-际-网-页-手-机-登-录一直在用他了;MySQL要被Oracle买了再给灭了。
2013年12月22日 21:16 | # | 引用
kmxz 说:
Debian 现在默认安装的数据库已经是 postgres 了。
2013年12月22日 21:27 | # | 引用
小谈 说:
能不能讲一讲mysql 被oracle收购了为什么有人认为它会衰落?因为oracle重点是oracle数据库的原因吗,这样收购mysql难道是为了把mysql弄死不成?
2013年12月22日 21:37 | # | 引用
diseng 说:
暑期参加oschina的开源源创会,阿里核心系统数据库组的褚霸同学说如果回到08年,他会建议集团使用PostgreSQL,而不是MySQL.PostgreSQL诞生于学院派,没有局限于当时的一些硬件条件,MySQL发展自程序员的业余作品,为当时的小内存小外存的硬件条件做了特殊的处理,随着硬件的不断发展,这些处理在现在看来倒成了一个缺点了;当然褚霸同学不仅仅说了这么一个点,我只是把印象最深的一点写出来
2013年12月22日 21:38 | # | 引用
路人 说:
maria 呢?
2013年12月22日 21:48 | # | 引用
latpaw 说:
除了用法有点奇怪,还是很好的
2013年12月23日 10:06 | # | 引用
swimm 说:
mariadb才是代替者吧,看看wikipedia
2013年12月23日 10:32 | # | 引用
陆贇 说:
MySQL和Postgresql的最大区别应该就是多线程和多进程设计的对决吧。虽然双方的出发点不一样,也各有优势,但是个人觉得多进程相对于多线程来说,管理和通信方面要方便不少,理解上也更简洁明了。
2013年12月23日 10:56 | # | 引用
赵广武 说:
没有干货!
2013年12月23日 17:02 | # | 引用
凡客 说:
写得很好,我也正想从mysql转过来。
2013年12月23日 17:47 | # | 引用
bob 说:
有个 enterpriseDB 上面有打包好的 PostgreSQL 可以免费下,各个os下的都有??梢允∪フ庋陌沧傲?。
2013年12月23日 23:43 | # | 引用
Echo 说:
PostgreSQL大名如雷贯耳,看来是大势所趋了,有空得多看看。
看了不少文章,颇有收获,谢阮兄。
2013年12月24日 13:37 | # | 引用
francs 说:
写得很好,感谢分享。
2013年12月24日 17:41 | # | 引用
hmy 说:
pgsql 应该算是买对对象的数据库
2013年12月24日 23:12 | # | 引用
ccc 说:
试了好几次,数据库用户都没创建成功,最后发现是sql语句没加分号...
2013年12月25日 10:27 | # | 引用
fgh 说:
pg的历史比mysql的长很多,在国外是很流行的,国内嘛,因为拿来主义的习惯,少人用,在数据量不大,连接数不多时,使用mysql是很好的选择(其实我觉得对于小应用sqlite更好),但上规模时,例如同时有成百上千个连接时,mysql就疲态了,而pg基本都能适应。但pg毕竟是“学院派”数据库,很多时候理论性强,甚至对一些基本的东西不做优化,例如count(*),可是会做全表扫描的,对于数百万条记录的表,这将消耗大量时间。
如果你的是小应用,用sqlite吧,真的是又快又好,而且无处不在,HTML5,android等都内置了它,在计算机界就相当mdb(Access)于windows。而且性能很多时候比mdb要好。
如果是大型应用,又不差钱,还是用商业数据库吧,毕竟数据的价值和买数据库软件的钱比起来还是九牛一毛,如果又缺钱又要好,就用pg。对于互联网应用,作为设计者,还应该考虑NoSQL数据库,例如mongoDB,有点“对象关系”的意思,速度更快,数据库可分布,数据结构灵活,不用像SQL数据库一样字斟句酌地设计表、关系、触发器、过程等,应用端可以更灵活。
2013年12月27日 10:06 | # | 引用
lyroge 说:
可以装上试试看,很多的开源程序在用postgresql做数据库 这篇文章提供一个基本的入门足够了,到真正用的时候再去查询详细用法。主要是开阔思路,开阔视野
2013年12月27日 14:36 | # | 引用
新一 说:
PgSQL火爆前的预告
2013年12月29日 09:55 | # | 引用
冰与火 说:
2013年最后一天,希望阮大哥能对这一年做个总结。2011和12年都错过了,今年和大家分享一下感受吧。
2013年12月31日 08:28 | # | 引用
D瓜哥 说:
阮老师好!
里面修改postgres用户密码时,应该使用passwd命令。文中是password。您检查一下。
2013年12月31日 10:39 | # | 引用
阮一峰 说:
passwd是shell命令,这里是指postgresql内部的命令,\password没错。
2013年12月31日 20:58 | # | 引用
阮一峰 说:
不好意思,不会有年度总结,至少今年不会。我有自己的苦衷,请谅解。
2013年12月31日 21:02 | # | 引用
keynote 说:
不错,希望能多写一点分享一下
2014年1月 2日 16:47 | # | 引用
sockpuppet002 说:
FYI,debian/ubuntu 官方原裏版本一般比較老,postgres 官方維護了一個 apt 源 https://wiki.postgresql.org/wiki/Apt 一直在更新的,有 bugfix 一般都第一時間出來
2014年1月 3日 11:37 | # | 引用
tewuapple 说:
PostgreSQL 官网上面怎么没找到redhat下面安装说明?还是您写的debian安装说明通俗易懂
2014年1月27日 16:18 | # | 引用
macrossyu 说:
国内也有人在研究PG的。
2014年2月 9日 23:30 | # | 引用
tewuapple 说:
user_tbl 不知道为什么你的表明加下划线,其实表名是没有下划线的
还有我按照你的方法添加用户和数据库
但是按照psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432 连接却提示:
FATAL: Ident authentication failed for user "dbuser"
2014年2月12日 10:08 | # | 引用
Steven Pan 说:
我也很喜欢Debian,博主什么写个硬盘安装的教程吧。
2014年3月10日 01:22 | # | 引用
codeyu 说:
创建表的时候表名是:usertbl
为啥选择表的时候变成了:user_tbl?
2014年3月27日 07:58 | # | 引用
阮一峰 说:
@codeyu:
刚发现,markdown自动把同一行的两个下划线,解释为斜体。
2014年3月27日 09:51 | # | 引用
Aaron 说:
我一直搞不懂Linux用户和数据库用户是什么关系。。。学习了
2014年4月19日 12:11 | # | 引用
mark 说:
多进程的优势是可以把多核处理器跑满
2014年5月 8日 18:40 | # | 引用
mark 说:
2014年5月 8日 18:45 | # | 引用
zeekvfu 说:
PostgreSQL 的提示符不只 postgres=# 一种。
不同的提示符,有不同的含义。
参考:http://stackoverflow.com/questions/19668825/meaning-of-different-command-line-prompts-in-postgresql
2014年6月17日 15:53 | # | 引用
calvert1991 说:
对我来说,这是很好的入门资料 谢谢了
2015年5月24日 19:14 | # | 引用
zenyadu 说:
您好,我想问一下,
我现在想在sql编辑器中使用脚本类修改连接的数据库,就是和sql的USE[数据库名]一样的功能,
该怎么实现?
2015年5月27日 11:48 | # | 引用
Ronnin Lee 说:
为什么要创建额外的系统用户 dbuser?
有时间,去看了psql文档,可能能自解。
听说,“对于数据库访问提供了强大的安全性保证,充分利用了企业安全工具,如Kerberos与OpenSSL等” (http://www.infoq.com/cn/news/2013/12/mysql-vs-postgresql)
阮老师,有没有计划,写个psql安全配置的专文?
非常感谢。你的文章非常用心,所以非常易懂。
2015年9月30日 16:38 | # | 引用
newfan 说:
我的也是这个错误?怎么解决
2016年4月28日 23:36 | # | 引用
bluesky504 说:
简洁,易懂,透彻,感谢。
2016年5月18日 13:50 | # | 引用
紫系流月 说:
添加dbuser用户之后,还需要设置dbuser密码吧
2016年10月17日 10:12 | # | 引用
高俅 说:
2016年10月26、27日,上海浦东,Postgres中国用户大会2016(PG大象会)已经圆满落幕了,大会现场大咖分享视频已经正式上线(含嘉宾演讲PPT),你可直接微信搜索公众号“IT大咖说”(公众号ID:itdakashuo)观看视频。
PG中国社区的发展,需要你的成长与实践,好好努力吧,也可转发朋友圈进行分享,让更多的朋友来了解和学习postgres,为postgreSQL在中国的成长贡献一份力量!谢谢!
2016年11月 4日 11:28 | # | 引用
libery 说:
创了数据库的所属住都是那个用户了,为什么还要给那个用户授权当前用户的所有权限呢,不赋权限也是可以创建表的,
2017年9月27日 18:55 | # | 引用
custa 说:
没理解创建 Linux 系统用户 dbuser 的作用是什么?
后面再 postgres 控制台中创建的是数据库的用户,跟 Linux 系统用户没有关联啊。
2017年9月29日 23:05 | # | 引用
大名 说:
我出现这种错误?
Is the server running locally and accepting
connections on Unix domain socket "/run/postgresql/.s.PGSQL.5432"?
2017年11月19日 21:28 | # | 引用
封建英 说:
您了解这个数据库做地图吗 里面涉及到经纬度存储 但是表格内无经纬度数据
2018年6月14日 10:57 | # | 引用
deping 说:
急着用postgres,看阮兄的博客迅速解决了问题。
2019年10月29日 16:11 | # | 引用
wangshushuo 说:
windows10装了winget的话,可以这样安装paAdmin: winget install PostgreSQL.pgAdmin-x64
2021年2月 7日 11:06 | # | 引用
黄大仙 说:
我的天,2013年我刚刚大学毕业,结果那么多年就过去了
2021年10月27日 19:39 | # | 引用
王宝海 说:
一件事用最简单的语言讲明白你是真的悟透了,感谢阮先生的指导,本来没有习惯去评论某些东西(白嫖),但看了一半这篇文章,憋不住,有种不吐不快感觉。再次感谢!
2022年11月 1日 13:44 | # | 引用
pger 说:
postgres 社区文档 PostgreSQL 文档资料汇总 一直在更新的,里面有学习教程,很适合新手入门
2023年5月26日 14:22 | # | 引用