PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL。PostgreSQL支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引。PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统)。
PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。
PostgreSQL 的确还欠缺一些比较高端的数据库管理系统需要的特性,比如数据库集群,更优良的管理工具和更加自动化的系统优化功能 等提高数据库性能的机制等。
==(注意:以下对于PostgreSQL的介绍基于9.4.9版本)==
deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-9.4
padmin: 这个工具目前只支持9.3,感觉不怎么好用
sudo apt-get install pgadmin3
dbeaver:
下载地址:http://dbeaver.jkiss.org/download/
新建一个Linux新用户,用于连接数据库,这里为 pguser。
sudo adduser pguser
然后切换到 postgres 用户。
sudo su - postgres
然后使用psql命令登录PostgreSQL控制台。
psql
这时相当于系统用户postgres以同名数据库用户的身份,登录数据库,这是不用输入密码的。如果一切正常,系统提示符会变为”postgres=#”,表示这时已经进入了数据库控制台。以下的命令都在控制台内完成。
使用\password命令,为postgres用户设置一个密码。
\password postgres
创建数据库用户 pguser(刚才创建的是Linux系统用户),并设置密码。
CREATE USER pguser WITH PASSWORD 'password';
创建用户数据库,这里为exampledb,并指定所有者为 pguser。
CREATE DATABASE exampledb OWNER pguser;
将exampledb数据库的所有权限都赋予 pguser,否则 pguser 只能登录控制台,没有任何数据库操作权限。
GRANT ALL PRIVILEGES ON DATABASE exampledb to pguser;
还有一种方式是使用shell命令添加心用户和新的数据库,如下:
创建数据库用户pguser,并指定其为超级用户。
sudo -u postgres createuser --superuser pguser
然后,登录数据库控制台,设置dbuser用户的密码,完成后退出控制台。
sudo -u postgres psql
\password pguser
\q
创建数据库exampledb,并指定所有者为 pguser。
sudo -u postgres createdb -O pguser exampledb
psql -U pguser -d exampledb -h localhost -p 5432
PostgreSQL具有最丰富的数据类型,如下:
Name | Aliases | Description |
---|---|---|
bigint | int8 | signed eight-byte integer |
bigserial | serial8 | autoincrementing eight-byte integer |
bit [ (n) ] | fixed-length bit string | |
bit varying [ (n) ] | varbit | variable-length bit string |
boolean | bool | logical Boolean (true/false) |
box | rectangular box on a plane | |
bytea | binary data (“byte array”) | |
character [ (n) ] | char [ (n) ] | fixed-length character string |
character varying [ (n) ] | varchar [ (n) ] | variable-length character string |
cidr | IPv4 or IPv6 network address | |
circle | circle on a plane | |
date | calendar date (year, month, day) | |
double precision | float8 | double precision floating-point number (8 bytes) |
inet | IPv4 or IPv6 host address | |
integer | int, int4 | signed four-byte integer |
interval [ fields ] [ (p) ] | time span | |
json | textual JSON data | |
jsonb | binary JSON data, decomposed | |
line | infinite line on a plane | |
lseg | line segment on a plane | |
macaddr | MAC (Media Access Control) address | |
money | currency amount | |
numeric [ (p, s) ] | decimal [ (p, s) ] | exact numeric of selectable precision |
path | geometric path on a plane | |
pg_lsn | PostgreSQL Log Sequence Number | |
point | geometric point on a plane | |
polygon | closed geometric path on a plane | |
real | float4 | single precision floating-point number (4 bytes) |
smallint | int2 | signed two-byte integer |
smallserial | serial2 | autoincrementing two-byte integer |
serial | serial4 | autoincrementing four-byte integer |
text | variable-length character string | |
time [ (p) ] [ without time zone ] | time of day (no time zone) | |
time [ (p) ] with time zone | timetz | time of day, including time zone |
timestamp [ (p) ] [ without time zone ] | date and time (no time zone) | |
timestamp [ (p) ] with time zone | timestamptz | date and time, including time zone |
tsquery | text search query | |
tsvector | text search document | |
txid_snapshot | user-level transaction ID snapshot | |
uuid | universally unique identifier | |
xml | XML data |
对于基本的数据库操作就不在这里赘述,由于自己也刚开始接触这个数据哭,这里只是简单介绍一下对于PostgreSQL特有的数据类型array和json的操作以及需要注意的问题。
CREATE TABLE person
(
id bigserial, --主键,这里的bigserial类型,会自动生成一个名为"[table_name]_id_seq"的sequence
name text, --姓名
hobby _text, --爱好
detail json, --详细介绍
CONSTRAINT person_pk PRIMARY KEY (id)
);
以上建表语句执行结果如下:
List of relations
Schema | Name | Type | Owner
--------+---------------+----------+----------
public | person | table | duanjian
public | person_id_seq | sequence | duanjian
(2 rows)
执行以下插入语句插入一条数据:
INSERT INTO person
(name, hobby, detail)
VALUES
('zhangsan', array['football', 'basketball', 'pingpong'], '{"age":18, "sex":"男"}'::json);
查看person表中的数据:
=>SELECT * FROM person;
id | name | hobby | detail
----+----------+--------------------------------+------------------------
1 | zhangsan | {football,basketball,pingpong} | {"age":18, "sex":"男"}
(1 row)
目前笔者也是刚开始使用这个数据库,感觉数据库确实很强大,只是相关的图形化工具不敢恭维。这一部分就先介绍到这里,后续还会进一步介绍。