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;