PostgreSQL入門,PostgreSQL和mysql

 

PostgreSQL被譽爲「世界上功能最強大的開源數據庫」,是以加州大學伯克利分校計算機系開發的POSTGRES 4.2爲基礎的對象關係型數據庫管理系統。html

PostgreSQL支持大部分 SQL標準而且提供了許多其餘現代特性:複雜查詢、外鍵、觸發器、視圖、事務完整性、MVCC。一樣,PostgreSQL 能夠用許多方法擴展,好比,經過增長新的數據類型、函數、操做符、彙集函數、索引。linux

開發者能夠無償使用、修改和分發 PostgreSQL,無論是私用、商用、仍是學術研究使用。web

 

 

 

PostgreSQL:是以加州大學伯克利分校計算機系開發的 POSTGRES,如今已經改名爲PostgreSQL,版本 4.2爲基礎的對象關係型數據庫管理系統(ORDBMS)。PostgreSQL支持大部分 SQL標準而且提供了許多其餘現代特性:複雜查詢、外鍵、觸發器、視圖、事務完整性、MVCC。一樣,PostgreSQL 能夠用許多方法擴展,好比, 經過增長新的數據類型、函數、操做符、彙集函數、索引。無償使用、修改、和分發 PostgreSQL,無論是私用、商用、仍是學術研究使用。sql

特色與優點:shell

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入門教程

1、安裝json

首先,安裝PostgreSQL客戶端。數組

sudo apt-get install postgresql-client
而後,安裝PostgreSQL服務器。bash

sudo apt-get install postgresql
正常狀況下,安裝完成後,PostgreSQL服務器會自動在本機的5432端口開啓。

若是還想安裝圖形管理界面,能夠運行下面命令,可是本文不涉及這方面內容。

sudo apt-get install pgadmin3
2、添加新用戶和新數據庫

初次安裝後,默認生成一個名爲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
3、登陸數據庫

添加新用戶和新數據庫之後,就要以新用戶的名義登陸數據庫,這時使用的是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
4、控制檯命令

除了前面已經用到的password命令(設置密碼)和q命令(退出)之外,控制檯還提供一系列其餘命令。

h:查看SQL命令的解釋,好比h select。
?:查看psql命令列表。
l:列出全部數據庫。
c [database_name]:鏈接其餘數據庫。
d:列出當前數據庫的全部表格。
d [table_name]:列出某一張表格的結構。
du:列出全部用戶。
e:打開文本編輯器。
conninfo:列出當前數據庫和鏈接的信息。
5、數據庫操做

基本的數據庫操做,就是使用通常的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)。前者是圖形界面工具,後者是命令行工具。
---------------------

 

 

 

 

 

2、添加新用戶和新數據庫

初次安裝後,默認生成一個名爲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":"root@yangbajing.me"}', now()),

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

('哈哈', '{3}', '{"email":"haha@yangbajing.me"}', 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": "root@yangbajing.me"}       | 2018-02-01 22:06:21.140465+08

3 | 哈哈   | {3}   | {"email": "haha@yangbajing.me"}       | 2018-02-01 22:06:21.140465+08

1 | 羊八井 | {2,3}   | {"email": "yangbajing@yangbajing.me"} | 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": "yangbajing@yangbajing.me"} | 2018-02-01 22:04:41.580203+08

(1 row)

相關文章
相關標籤/搜索