1. 程式人生 > >PostgreSQL入門,PostgreSQL和mysql PostgreSQL入門教程

PostgreSQL入門,PostgreSQL和mysql PostgreSQL入門教程

 

PostgreSQL被譽為“世界上功能最強大的開源資料庫”,是以加州大學伯克利分校計算機系開發的POSTGRES 4.2為基礎的物件關係型資料庫管理系統。

PostgreSQL支援大部分 SQL標準並且提供了許多其他現代特性:複雜查詢、外來鍵、觸發器、檢視、事務完整性、MVCC。同樣,PostgreSQL 可以用許多方法擴充套件,比如,通過增加新的資料型別、函式、操作符、聚集函式、索引。

開發者可以免費使用、修改和分發 PostgreSQL,不管是私用、商用、還是學術研究使用。

 

 

 

PostgreSQL:是以加州大學伯克利分校計算機系開發的 POSTGRES,現在已經更名為PostgreSQL,版本 4.2為基礎的物件關係型資料庫管理系統(ORDBMS)。PostgreSQL支援大部分 SQL標準並且提供了許多其他現代特性:複雜查詢、外來鍵、觸發器、檢視、事務完整性、MVCC。同樣,PostgreSQL 可以用許多方法擴充套件,比如, 通過增加新的資料型別、函式、操作符、聚集函式、索引。免費使用、修改、和分發 PostgreSQL,不管是私用、商用、還是學術研究使用。

特點與優勢:

PostgreSQL 是一個自由的物件-關係資料庫伺服器(資料庫管理系統),它在靈活的 BSD-風格許可證下發行。它提供了相對其他開放原始碼資料庫系統(比如 MySQL 和 Firebird),和專有系統(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一種選擇。
PostgreSQL 不尋常的名字導致一些讀者停下來嘗試拼讀它,特別是那些把SQL拼讀為"sequel"的人。PostgreSQL 開發者把它拼讀為 "post-gress-Q-L"。它也經常被簡略念為 "postgres"。
事實上, PostgreSQL 的特性覆蓋了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以說是目前世界上最豐富的資料型別的支援,其中有些資料型別可以說連商業資料庫都不具備, 比如 IP 型別和幾何型別等;其次,PostgreSQL 是全功能的自由軟體資料庫,很長時間以來,PostgreSQL 是唯一支援事務、子查詢、多版本並行控制系統(MVCC)、資料完整性檢查等特性的唯一的一種自由軟體的資料庫管理系統。 Inprise 的 InterBase 以及SAP等廠商將其原先專有軟體開放為自由軟體之後才打破了這個唯一。最後,PostgreSQL擁有一支非常活躍的開發隊伍,而且在許多黑客的努力下,PostgreSQL 的質量日益提高。

從技術角度來講,PostgreSQL 採用的是比較經典的C/S(client/server)結構,也就是一個客戶端對應一個伺服器端守護程序的模式,這個守護程序分析客戶端來的查詢請求,生成規劃樹,進行資料檢索並最終把結果格式化輸出後返回給客戶端。為了便於客戶端的程式的編寫,由資料庫伺服器提供了統一的客戶端 C 介面。而不同的客戶端介面都是源自這個 C 介面,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同時也要指出的是,PostgreSQL 對介面的支援也是非常豐富的,幾乎支援所有型別的資料庫客戶端介面。這一點也可以說是 PostgreSQL 一大優點。

 

 

 


PostgreSQL入門教程

一、安裝

首先,安裝PostgreSQL客戶端。

sudo apt-get install postgresql-client
然後,安裝PostgreSQL伺服器。

sudo apt-get install postgresql
正常情況下,安裝完成後,PostgreSQL伺服器會自動在本機的5432埠開啟。

如果還想安裝圖形管理介面,可以執行下面命令,但是本文不涉及這方面內容。

sudo apt-get install pgadmin3
二、新增新使用者和新資料庫

初次安裝後,預設生成一個名為postgres的資料庫和一個名為postgres的資料庫使用者。這裡需要注意的是,同時還生成了一個名為postgres的Linux系統使用者。

下面,我們使用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。還是以新建使用者dbuser和資料庫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;

 

 

 

 

 

 

 

 

架構基礎
行話:pgsql使用了客戶端/伺服器模式。一個pgsql會話包含包含兩個程序:
伺服器程序。管理資料庫檔案,接收客戶端程式的連線請求,代表客戶端執行資料庫操作。資料庫伺服器程式叫做postgres。客戶端應用程式。進行資料庫操作。客戶端應用程式本質上可以非常多樣化,一個客戶端可以是一個面向文字的工具,一個圖形介面應用程式,一個通過訪問資料庫來顯示網頁的web伺服器,或者一個專門的資料庫維護工具。有些是pgsql自帶的,大部分是使用者開發的。
客戶端和伺服器可以在不同的主機上,通過TCP/IP連線通訊。記住這一點很重要,因為客戶機上的檔案再伺服器上可能是訪問不到的,或者只能換個檔名訪問。
pgsql伺服器可以處理多併發的連線,它會為每個連線fork一個新的程序。客戶端和新的伺服器程序的通訊與就伺服器程序沒有關係。主伺服器程序會一直保持執行,等待客戶端連線。

建立資料庫
建立資料庫可以檢查你是否連線到了伺服器。一個pgsql伺服器可以管理很多資料庫。
建立一個名為mydb的資料庫:
$ createdb mydb
如果回車之後沒有任何輸出,說明建立資料庫成功。你可以跳過本節了。

萬一不幸出錯了,這裡給出了一些解決辦法。
1. 找不到命令,錯誤如下:
createdb: command not found
說明pgsql的bin目錄沒有新增到環境變數。你可以選擇將bin目錄新增到環境變數,或者去bin目錄下開啟命令視窗,再或者使用絕對路徑呼叫createdb命令。
$ /user/local/pgsql/bin/createdb mydb
建議新增還是新增環境變數,一勞永逸。
2. 服務未啟動,錯誤如下:
createdb: could not connect to database postgres: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
表示伺服器未啟動,至少是在createdb執行的時候還未啟動。多試試吧,我也不知道該咋辦。
3. 沒有賬戶,錯誤如下:
createdb: could not connect to database postgres: FATAL: role "joe" does not exist
這裡joe是作業系統賬戶,pgsql使用者賬戶與作業系統賬戶不同。你需要登入Postgres賬戶,建立一個使用者賬戶。也可能是你被分配的pgsql賬戶名與作業系統使用者名稱不同,這時,你可以使用-U選項指定賬戶或設定PGUSER環境變數來指定pgsql的使用者名稱。
$ createdb -U user mydb
其中,user就是你的pgsql賬戶名。
4. 許可權不足,錯誤如下:
createdb: database creation failed: ERROR: permission denied to create database
這是你的賬戶沒有建立資料庫的許可權,你可以登入管理員賬戶進行修改。
pgsql允許建立任意數量的資料庫。資料庫名稱必須以英文字母開頭,且不超過63位元組。
可以省略資料庫名,建立與當前使用者同名的資料庫,如下:
$ createdb
刪除資料庫用dropdb命令:
$ dropdb mydb
dropdb命令必須指定資料庫名稱,即使是與使用者名稱同名的資料庫也必須指定,它不會預設用賬戶名。它會刪除與資料庫相關聯的所有檔案,並且不能撤銷,所以一定要三思而行。

訪問資料庫
有三種方式可以訪問資料庫:
pgsql終端,psql命令列工具;pgAdmin或支援ODBC或JDBC的office套件;程式語言API。
這裡只介紹第一種方式,第二種方式不做介紹,第三種方式後面再說。
開啟cmd(或PowerShell)命令列視窗,希望你之前已經設定過環境 變量了。輸入一下命令啟動psql :
$ psql mydb
mydb就是之前建立的資料庫。如果不指定資料庫名稱,預設會訪問與當前賬戶名同名的資料庫。
回車後輸入密碼,你會得到如下輸出:
​x psql (10.4)Type "help" for help.​mydb=>
mydb=>就是命令提示符,你可以輸入SQL指令(以;結尾)或psql命令(以\開頭)。
如果命令提示符是mydb=#,表示當前賬戶是超級使用者。
你可以輸入以下幾個命令試試:
mydb=> SELECT version();
mydb=> SELECT current_date;
mydb=> SELECT 2 + 2;
上面三個命令都是SQL命令,它們都以;結尾。
psql內部命令都以\開頭。例如\h命令可以獲取幫助,\q命令用來退出psql。
mydb=> \h
mydb=> \q

psql與cmd
pgsql安裝後會預設安裝兩個工具,pgAdmin和SQL Shell(psql)。前者是圖形介面工具,後者是命令列工具。
---------------------

 

 

 

 

 

二、新增新使用者和新資料庫

初次安裝後,預設生成一個名為postgres的資料庫和一個名為postgres的資料庫使用者。這裡需要注意的是,同時還生成了一個名為postgres的Linux系統使用者。

下面,我們使用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。還是以新建使用者dbuser和資料庫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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

安裝 PostgreSQL 10

下載 PostgreSQL 10,postgresql-10.1-3-linux-x64-binaries.tar.gz。下載地址:https://get.enterprisedb.com/postgresql/postgresql-10.1-3-linux-x64-binaries.tar.gz。

(注:安裝指令碼如下(需要有 /opt/local 寫許可權),可使用如下命令建立 /opt/local 目錄。)

1

2

sudo mkdir /opt/local

sudo chown -R $USER:$USER /opt/local

install_pg.sh

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

OPT_BASE=/opt

PGVERSION=10.1

PGBASE=$OPT_BASE/local/pgsql

PGHOME=$OPT_BASE/local/pgsql/$PGVERSION

PGDATA=$OPT_BASE/var/pgsql/$PGVERSION

PG_SOFT_¥TAR="postgresql-10.1-3-linux-x64-binaries.tar.gz"

if [ -d $PGHOME ]; then

rm -rf $PGHOME

elif [ ! -d $PGBASE ]; then

mkdir -p $PGBASE

fi

if [ ! -d $PGDATA ]; then

mkdir -p $PGDATA

fi

echo "Install PostgreSQL"

tar zxf $PG_SOFT_TAR -C $PGBASE

mv $PGBASE/pgsql $PGHOME

cp pg-pwfile $PGHOME

echo "Init PostgreSQL"

pushd $PGHOME

./bin/initdb --pgdata="$PGDATA" --auth=ident --auth-host=md5 --encoding=UTF-8 --locale=zh_CN.UTF-8 --username=postgres --pwfile=pg-pwfile

rm -f pg-pwfile

popd

cp pg_hba.conf $PGDATA

cp postgresql.conf $PGDATA

chmod 600 $PGDATA/*.conf

echo "Start PostgreSQL"

$PGHOME/bin/pg_ctl -D $PGDATA -l logfile start

sleep 5

#cp .pgpass ~/

$PGHOME/bin/psql -h localhost -U postgres -d postgres -f pg_init.sql

install_pg.sh 指令碼安裝時依賴檔案的完整版壓縮包在此下載:https://yangbajing.me/files/postgresql10-scripts.tar.gz

  • pg-pwfile:在初始化資料庫時設定預設管理員賬戶的密碼

  • pg_hba.conf:預設只允許 127.0.0.1/8 訪問資料庫,這裡改成允許所有網段可訪問

  • postgresql.conf:修改資料庫監聽地址為 * ,監聽所有本地網路地址

  • pg_init.sql:建立一個普通賬戶 yangbajing 和測試用資料庫 yangbajing ,密碼也設定為 yangbajing

安裝後PG資料庫管理管理員賬號是 postgres,密碼為 postgres。同時,還建立了一個普通賬號:yangbajing 和同名資料庫 yangbajing,密碼也是 yangbajing

將 /opt/local/pgsql/10.1/bin 目錄加入系統環境變數。

1

2

echo 'export PATH="/opt/local/pgsql/10.1/bin:$PATH" >> ~/.bashrc

. ~/.bashrc

使用如下命令來啟動或停止PostgreSQL 10資料庫

啟動資料庫

1

pg_ctl -D /opt/local/var/pgsql/10.1 -l logfile start

停止資料庫

1

pg_ctl -D /opt/local/var/pgsql/10.1 -l logfile stop

體驗 PG

輸入以下命令訪問PG資料庫:

1

psql -h localhost -U yangbajing -d yangbajing -W

根據提示輸入密碼登入,進入 psql 的 REPL 介面。

1

2

3

4

5

Password for user yangbajing:

psql.bin (10.1)

Type "help" for help.

yangbajing=>

先建立一些測試表:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

CREATE TABLE t_role (

id         INT PRIMARY KEY,

name       VARCHAR(255) NOT NULL,

created_at TIMESTAMPTZ

);

CREATE TABLE t_user (

id         BIGSERIAL PRIMARY KEY,

name       VARCHAR(255) NOT NULL,

roles      INT []       NOT NULL,

data       JSONB,

created_at TIMESTAMPTZ

);

INSERT INTO t_role (id, name, created_at) VALUES (1, '超級管理員', now()), (2, '管理員', now()), (3, '使用者', now());

INSERT INTO t_user(name, roles, data, created_at) VALUES

('root', '{1}', '{"email":"[email protected]"}', now()),

('羊八井', '{2,3}', '{"email":"yangbajing"}', now()),

('哈哈', '{3}', '{"email":"[email protected]"}', now());

先來執行兩個簡單的 SELECT 查詢:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

yangbajing=> select * from t_role;

id |    name    |          created_at

----+------------+-------------------------------

1 | 超級管理員 | 2018-02-01 22:03:17.168906+08

2 | 管理員     | 2018-02-01 22:03:17.168906+08

3 | 使用者       | 2018-02-01 22:03:17.168906+08

(3 rows)

yangbajing=> select * from t_user;

id |  name  | roles |                 data                  |          created_at

----+--------+-------+---------------------------------------+-------------------------------

2 | root   | {1}   | {"email": "[email protected]"}       | 2018-02-01 22:06:21.140465+08

3 | 哈哈   | {3}   | {"email": "[email protected]"}       | 2018-02-01 22:06:21.140465+08

1 | 羊八井 | {2,3}   | {"email": "[email protected]"} | 2018-02-01 22:04:41.580203+08

(3 rows)

接下來,嘗試一些 PG 特色特性。

InsertOrUpdate

插入或更新,是一個很有用的特性,當在主鍵衝突時可以選擇更新資料。在PG中,是使用 ON CONFLICT 來實現這個特性的。

1

2

3

4

INSERT INTO t_role (id, name, created_at)

VALUES (3, '普通使用者', now())

ON CONFLICT (id)

DO UPDATE SET name = EXCLUDED.name;

在常用的 INSERT 語句後面用 ON CONFLICT (...) DO .... 語句來指定在某個/些欄位出現衝突時需要執行的語句。在 on CONFLICT (...) 裡的引數需要是主鍵或唯一索引(可以為複合字段)。當衝突發生時則會執行 DO .... 後面的語句,這裡我們選擇更新 name 欄位的值。EXCLUDED 是使用者引用在 VALUES .... 部分我們將插入的資料,EXCLUDED.name 在這裡就是 '普通使用者' 。除 DO UPDATE,我們還可以使用 DO NOTHING 來簡單的忽略插入時的主鍵衝突。

SERIAL/BIGSERIAL

看看錶 t_user 的結構:

1

2

3

4

5

6

7

8

9

10

11

yangbajing=> \d t_user

Table "public.t_user"

Column   |           Type           | Collation | Nullable |              Default

------------+--------------------------+-----------+----------+------------------------------------

id         | bigint                   |           | not null | nextval('t_user_id_seq'::regclass)

name       | character varying(255)   |           | not null |

roles      | integer[]                |           | not null |

data       | jsonb                    |           |          |

created_at | timestamp with time zone |           |          |

Indexes:

"t_user_pkey" PRIMARY KEY, btree (id)

在建表時 id 欄位的型別定義的是 BIGSERIAL ,但這裡卻是顯示的 bigint 型別;另外,還多了一個預設值:nextval('t_user_id_seq'::regclass) 。這是 PG 中的 序列 ,PG中使用序列來實現 自增值 的特性。

序列:t_user_id_seq

1

2

3

4

5

6

yangbajing=> \d t_user_id_seq

Sequence "public.t_user_id_seq"

Type  | Start | Minimum |       Maximum       | Increment | Cycles? | Cache

--------+-------+---------+---------------------+-----------+---------+-------

bigint |     1 |       1 | 9223372036854775807 |         1 | no      |     1

Owned by: public.t_user.id

也可以先建立序列,再設定欄位的預設值為該序列的下一個值。

1

CREATE SEQUENCE t_user_id2_seq INCREMENT BY 1 MINVALUE 1 START WITH 1;

這裡建立一個序列,設定最小值為1,從1開始按1進行遞增。

陣列型別

在建立 t_user 表的 roles 欄位時,使用了陣列型別 INT [] 。陣列型別對於我們的資料建模來說很有用,使用得好可以大大減少關係表的數量。

根據索引返回值

1

2

3

4

5

6

7

yangbajing=> SELECT id, name, roles[2], created_at FROM t_user;

id |  name  | roles |          created_at

----+--------+-------+-------------------------------

2 | root   |       | 2018-02-01 22:06:21.140465+08

3 | 哈哈   |       | 2018-02-01 22:06:21.140465+08

1 | 羊八井 |     1 | 2018-02-01 22:04:41.580203+08

(3 rows)

注意:PG 中,索引下標從0開始

以行的形式輸出陣列元素

1

2

3

4

5

6

7

8

yangbajing=> SELECT id, unnest(roles) AS role_id FROM t_user;

id | role_id

----+---------

2 |       1

3 |       3

1 |       2

1 |       1

(4 rows)

包含查詢

1

2

3

4

5

yangbajing=> SELECT * FROM t_user WHERE roles @> ARRAY[1,2];

id |  name  | roles |                 data                  |          created_at

----+--------+-------+---------------------------------------+-------------------------------

1 | 羊八井 | {2,1} | {"email": "[email protected]"} | 2018-02-01 22:04:41.580203+08

(1 row)

 

 

 

 

 

 

一、安裝

首先,安裝PostgreSQL客戶端。

sudo apt-get install postgresql-client
然後,安裝PostgreSQL伺服器。

sudo apt-get install postgresql
正常情況下,安裝完成後,PostgreSQL伺服器會自動在本機的5432埠開啟。

如果還想安裝圖形管理介面,可以執行下面命令,但是本文不涉及這方面內容。

sudo apt-get install pgadmin3
二、新增新使用者和新資料庫

初次安裝後,預設生成一個名為postgres的資料庫和一個名為postgres的資料庫使用者。這裡需要注意的是,同時還生成了一個名為postgres的Linux系統使用者。

下面,我們使用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。還是以新建使用者dbuser和資料庫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;