PostgreSQL實例參考

 

陳景峰(netkiller)

前言

經過三個月的努力《PostgreSQL 實用實例參考》正式版終於推出了。因為最近換了工作,新公司的工作也很忙所以文檔進展很慢,從最初幾十頁寫到現在200頁的文檔,每天寫文檔的時間越來越少,有時一周也就只寫2頁,甚至一週一字未對。

正式版推出了,然後就是不斷的修正。可能這段時間《PostgreSQL 實用實例參考》更新會更慢些。因為我還有其他文檔要寫:《OpenLDAP 文檔》、《PHP + Corba + Python文檔》、《JBuilder + Weblogic + PostgreSQL 開發EJB》。。。。。

 

文檔中所有例子,都是在工作總結出來的,如有錯誤請指正。本人愛寫錯別字(哈哈)如果你發現了有錯字,請發郵件給我netkiller(at)9812(dot)net修正文檔。

 

300頁之後不再推出HTML格式的文檔了,之後的文檔以PDFPSPostScript)格式為主,我是使用Microsoft Word寫文檔,處理300頁的文檔很困難,在保存文檔或將doc檔轉成其他格式的檔時經常會出現無回應。我也考慮過使用docbook / latex,或Page Maker。前者非所見即所得,要用戶使用XML撰寫,通過make一類的命令可以生成多種格式的文檔,docbook也是UNIX手冊的標準格式。後者Page Maker不用說了,Adobe出品,生成PDF更好些。

這是我第一次寫一篇如此長的文檔,沒有經驗,寫的不好,不敢稱為“書”,所以我叫它“文檔”。

1.1    本文檔的讀者對象

文檔面向有一定資料庫基礎用戶。在這裏我假設你對資料有一定認識,能夠使用create創建資料與表,能夠使用selectinsertupdate等語句操作資料庫記錄。

       不管是誰,我希望這本文檔都能對你有所幫助。

1.2    本文檔主要內容

第一章    主要介紹PostgreSQL

第二章    是開發中遇到的一些問題

 

附錄中一些SQL腳本文件,可供用戶參考。

1.3    怎樣使用本文檔

邊看、邊做、邊試驗,然後總結,多動腦。有問題先查查這本文檔,如果文檔中沒有提到,再考慮其他方式,或與我聯繫。

作者簡介

作者資訊:

陳景峰,昵稱:netkiller, UNIX like愛好者,研究方向群集系統、網路安全、資料倉庫與資料挖掘、LDAPJ2EECorba,企業解決方案。

主頁地址:

http://www.9812.net/

 

ICQ:101888222

Yahoo:snetkiller

AIM:xnetkiller

網易泡泡:openunix@163.com

E-Mail: netkiller@9812.net

 

有問題最好給我發Email或去下面的Newsgroup裏討論

news://news.cdut.edu.cn/cn.lang.java

news://news.cdut.edu.cn/cn.lang.python

 

Web Newsgroup:

http://202.103.190.130:8080/news

 

我常去的BBS

http://www.pgsqldb.org

http://www.chinaunix.com

http://www.linuxforum.net

 


目錄

前言... 2

1.1          本文檔的讀者對象... 2

1.2          本文檔主要內容... 2

1.3          怎樣使用本文檔... 3

作者簡介... 3

目錄... 5

第一章 PostgreSQL. 10

1     簡介... 10

1.4          關於性能... 10

1.5          為什麼說postgresql是最先進的開源資料庫?... 10

1.6          PostgreSQLSQL99的支持... 11

2     PostgreSQL 資料庫... 12

2.1          PostgreSQL分區... 12

2.2          RPM包安裝... 13

2.3          APT 安裝... 17

2.4          PostgreSQL 8.0 beta for windows版本安裝... 19

2.4.1       運行pgAdmin III 20

2.4.2       psql控制臺:... 20

2.4.3       ODBC. 21

2.4.4       Unix/Linux 登錄到Windows. 23

2.4.5       Windows 登錄到 Unix/Linux. 24

2.5          資料庫備份方案... 24

2.5.1       備份資料庫腳本... 24

2.5.2       下載備份腳本... 25

2.5.3       保證備份資料的安全-PGP/GPG加密... 26

2.6          備份計畫... 41

2.6.1       伺服器端計畫... 41

2.6.2       用戶端計畫... 42

2.7          資料恢復... 42

2.8          性能提升... 43

2.8.1       共用記憶體... 43

2.8.2       最大連接... 44

2.8.3       vacuumdb. 50

2.8.4       資料庫操作與性能... 50

2.8.5       硬體方面... 51

2.8.6       磁片性能... 53

2.9          安全的TCP/IP聯接... 56

2.9.1       使用SSL進行安全的TCP/IP聯接... 56

2.9.2       使用SSH進行安全TCP/IP聯接... 69

2.10        連接ipv6主機... 71

3     資料定義(DDL... 74

3.1          日期時間常量... 74

3.1.1       當前日期... 74

3.1.2       當前時間... 74

3.1.3       當前日期時間... 75

3.1.4       除去時區... 75

3.1.5       計算時間差... 75

3.1.6       計算時間和... 76

3.1.7       date_part 76

3.2          漢字做欄位名... 77

3.3          ::資料轉換... 79

3.3.1       text to varchar 79

3.4          序列... 81

3.4.1       等差列... 81

3.4.2       “123456789…”. 82

3.4.3       “13579…”. 83

3.4.4       “246810…”. 84

3.4.5       n1+n2 85

3.5          約束... 85

3.6          檢查約束... 85

3.7          非空約束... 87

3.8          唯一約束... 87

3.8.1       單字段約束... 87

3.8.2       多個欄位組合約束... 87

3.8.3       唯一約束的注意事項... 89

3.9          主鍵/外鍵... 91

3.9.1       主鍵... 91

3.9.2       外鍵約束... 92

3.9.3       PostgreSQL 7.3.x 新增功能... 93

3.9.4       層次遞迴-分類目錄... 93

3.9.5       總結... 101

3.10        模式... 101

3.10.1     創建模式... 101

3.10.2     刪除模式... 101

3.10.3     模式搜索路徑... 102

4     實體關係(Entity-Relation... 104

4.1          E-R圖(Entity-Relation... 104

4.2          一對多關係... 105

4.3          多對多關係... 107

4.4          一對一關係... 109

4.5          引用完整性... 110

5     查詢SQLDML... 111

5.1          子查詢... 111

5.2          substring()函數截取部分漢字... 113

5.3          sum()使用技巧... 115

5.4          集合查詢 (合併n個表)... 116

6     視圖... 119

6.1          VIEW基本使用實例... 119

6.2          使用HTML格式化VIEW的實例... 120

6.3          view中使用漢字做欄位名... 124

6.4          取出字元如果超過20個在後尾加“…”. 125

6.5          視圖中使用子查詢... 126

7     過程與函數... 127

7.1          基本使用實例... 127

7.2          過程中使用Select Into. 128

7.3          返回integer 130

7.4          返回void. 130

7.5          返回結果集record. 131

7.6          例子... 132

7.7          shell 過程語言... 133

8     規則... 134

8.1          規則實例... 134

9     觸發器... 137

9.1          一般用法... 137

9.2          多個觸發器使用同一個過程... 137

9.3          時間調度觸發器... 140

9.3.1       定時觸發器... 141

9.3.2       週期觸發器... 141

9.4          其他例子... 142

10           游標... 145

10.1        游標結果集... 146

10.2        例子... 147

11           事務處理... 148

11.1        批量插入、更新、刪除... 148

11.1.1     批量插入操作-1. 148

11.2        保持資料完整-2. 149

12           用戶許可權... 150

12.1.1     ... 150

12.1.1.1    創建組... 150

12.1.1.2    刪除組... 151

12.1.2     用戶... 151

12.1.2.1    創建用戶... 151

12.1.2.2    刪除用戶... 152

12.1.2.3    修改密碼... 152

12.1.3     創建資料... 153

12.1.4     用戶認證... 153

12.1.4.1    本地連接... 153

12.1.4.2    允許任何IP連接主機... 154

12.1.5     腳本例子... 154

12.1.6     許可權... 155

13           其他技巧例子... 155

第二章 開發篇... 155

13.1        漢字編碼問題... 155

13.2        JDBC. 155

13.2.1     Jsp/Java. 156

13.2.2     toChinese() 方法... 156

13.2.3     Unicode (UTF-8) 完全解決方案... 156

13.2.3.1   setCharacterEncoding() 方案... 156

13.2.3.2   Web.xml Filter過濾方案:... 159

13.2.3.3   Jdbc url charSet方案... 165

13.3        Tomcat JNDI Datasource 配置... 165

13.4        JDBC通過SSL安全連接資料庫... 168

13.5        開發相關... 168

13.5.1     Create Java Entity Bean (not EJB CMP) 168

13.5.2     連接資料庫... 169

13.5.3     處理SQL 語句... 180

13.5.4     處理HTML表格... 185

13.5.5     什麼時候應該把檔存在資料庫中... 213

14           PHP. 215

14.1        PHP 連接PostgreSQL. 215

14.2        set CLIENT_ENCODING TO 'GB18030';方案... 215

14.3        convert()方案... 225

14.4        PHP iconv() 函數方案... 225

14.5        在標準I/O上使用 Linux iconv 命令方案... 226

15           開發工具/開發環境... 231

15.1        Macromedia Dreamweaver MX 2004 JSP開發環境的配置... 231

15.2        Jcreator 240

15.3        Eclipse. 241

15.4        JBuilder + Weblogic + PostgreSQL開發環境... 242

15.5        GUI資料庫管理與設計(建模)工具... 273

15.5.1     phpPgAdmin. 273

15.5.2     PgAdmin III 275

15.5.3     Case Studio 2. 276

15.5.4     PostgreSQL Manager 284

15.5.5     DeZign for Databases. 289

15.5.6     GUI工具比較... 291

16           FAQ.. 291

16.1        關於“null 291

16.2        Postgresql與其他資料庫... 291

16.3        Putty. 294

16.3.1     Putty密鑰認證... 294

16.3.2     中輸入漢字的問題... 299

16.4        控制臺下輸入漢字... 303

16.5        PostgreSQL RPM 包安裝後,為何沒有5432... 303

16.6        PostgreSQL 7.4.2 rhel3(高級伺服器版,俗稱AS3) 306

16.7        Pureftpd pgsql認證模組... 306

16.8        Vsftpd pgsql認證... 306

16.9        OpenLDAP-PostgreSQL HOWTO.. 307

16.10      PostgreSQL 成功案例與解決方案... 307

17           附錄... 307

17.1        實例... 307

17.2        實例... 315

17.3        安裝腳本... 337

17.3.1     setenv.sh. 337

17.3.2     install.sh. 338

17.4        附件... 342

17.5        其他... 342

18           參考資料... 343

19           版本、聲明... 343

 


 

第一章 PostgreSQL

PostgreSQL Wins Linux Journal Editors Choice Award
Posted on 2004-08-02
Posted by press at postgresql.org

PostgreSQL has won the 2004 Linux Journal Editors' Choice Award for the best DBMS!

Linux Journal's Editors' Choice Awards are well-known as the premiere forum recognizing outstanding product developments and achievements in the Linux market, and winners of the sixth annual awards are featured in the August 2004 issue of Linux Journal.

Check out the full article.

1       簡介

我接觸PostgreSQL2000年,但項目中使用PostgreSQL2003年,2000當時應該是5.x6.x版本我並沒有深入地研究這個資料庫,還是主要使用MS Sql Server 7/2000 Oracle 8

因為很多企業難以支付MS Sql Server 7/2000 Oracle 8這筆費用,所以Free Database是最佳選擇。但大多免費的資料庫,功能有限、性能也差,跟本不能滿足我們的需求。

1.4    關於性能

有一段時間裏我們使用MySQL,實在不好用,功能太少,它只實現了SQL92 中不到30%的功能。除了selectinsertupdatedelete還有什麼功能?一味強調速度快,真的是這樣嗎?MySQL資料量增加很大時,速度下劃很快。

幾萬條記錄時速度最快,幾十萬記錄時速度不同了,幾百萬時就開始慢了。PostgreSQL 隨著資料量增大時,速度變化差距不象MySQL那麼大。

有些朋友在網上說(觸發器、游標、外鍵、視圖)影響性能。這裏要說明一下如果適當的使用視圖、子查詢、觸發器、游標……會讓你開發更輕鬆。

注:關於游標,很多SQL書中這樣寫“游標就是指向一行的指標”在PostgreSQL有些不同,它是返回一個結果集,對結果集next 操作返回一行。

 

Phpbuilder上有一篇文章是寫PostgreSQL MySQL 大家可以去看看。

1.5    為什麼說postgresql是最先進的開源資料庫?

1.         技術領先:
很多新技術都是它提出的
如:pl過程語言.在其他資料系統中都有自己的專用PL語言。而PostgreSQL中支援很多種PL語言(pl/tcl,pl/python,pl/perl,pl/php,pl/shell/pl/pgsql,pl/java.......
還有面象物件(ORDBMS)他實現的也很早.
他的資料類型支援很全.如幾何型,陣列...在其他RDBMS中是沒有的.
總是有新的技術、思想加入其中

2.         在開源ORDBMSPostgreSQL功能最強.也最完善

1.6    PostgreSQLSQL99的支持

SQL-3/SQL99

PRIMARY KEY主鍵

FOREIGN KEY外鍵

Schema 模式

TOAST大對象

View視圖

正則運算式

subquery子查詢

TRIGGER觸發器

RULE規則

FUNCTION過程/函數

CURSOR游標

PLSQL 過程語言

PL/pgSQL,PL/Tcl,PL/Perl,PL/Python,plPHP等等)

OLTP表的鎖定、事務隔離

許可權

√(用戶、組)

Object對象支援

ORDBMS

 

 

其他:

連接

進程方式

SSL

群集(HA,資料同步複製。。。)

ODBC

JDBC

裸設備

目前不支持

下面是一些限制:

一行,一個表,一個庫的最大尺寸是多少?

一個資料庫最大尺寸?

無限制(存在 32TB 的資料庫)

一個表的最大尺寸?

32TB

一行的最大尺寸?

1.6TB

一個欄位的最大尺寸?

1GB

一個表裏最大行數?

無限制

一個表裏最大列數?

跟列類型有關,250-1600

一個表裏的最大索引數量?

無限制

      

當然,實際上沒有真正的無限制,還是要受可用磁碟空間、可用記憶體/交換區的制約。表的最大尺寸 32 TB 不需要作業系統對大檔的支援。大表用多個 1 GB 的檔存儲,因此檔系統尺寸的限制是不重要的。如果缺省的塊大小增長到 32K ,最大的表尺寸和最大列數可以增加。

這裏引用http://www.pgsqldb.org/postgres-faq.html4.5詳細請登錄網站查看。

2       PostgreSQL 資料庫

2.1    PostgreSQL分區

PostgreSQL 最好自己單獨一個分區,如果你有兩塊硬碟建議你給它單獨一塊硬碟。

[chen@linux chen]$ df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda9              1004024     99892    853128  11% /

/dev/sda1               101089      9498     86372  10% /boot

/dev/sda2            120952116   7648124 107159936   7% /home

none                    515400         0    515400   0% /dev/shm

/dev/sda10             2522048     33260   2360672   2% /tmp

/dev/sda7              5036284   2238244   2542208  47% /usr

/dev/sda6              5036284   1919140   2861312  41% /var

/dev/sda5             40313964     99444  38166636   1% /var/lib/pgsql

/dev/sda3             60476068    212532  57191508   1% /cvsroot

[chen@linux chen]$

 

[chen@linux chen]$ df -m

Filesystem           1M-blocks      Used Available Use% Mounted on

/dev/sda9                  980        98       833  11% /

/dev/sda1                   99        10        84  10% /boot

/dev/sda2               118117      7469    104648   7% /home

none                       503         0       503   0% /dev/shm

/dev/sda10                2463        33      2305   2% /tmp

/dev/sda7                 4918      2186      2482  47% /usr

/dev/sda6                 4918      1875      2794  41% /var

/dev/sda5                39369        98     37272   1% /var/lib/pgsql

/dev/sda3                59059       208     55851   1% /cvsroot

[chen@linux chen]$

2.2    RPM包安裝

[root@linux software]# ls -1

postgresql-7.3.4-1PGDG.i386.rpm

postgresql-contrib-7.3.4-1PGDG.i386.rpm

postgresql-debuginfo-7.3.4-1PGDG.i386.rpm

postgresql-devel-7.3.4-1PGDG.i386.rpm

postgresql-docs-7.3.4-1PGDG.i386.rpm

postgresql-jdbc-7.3.4-1PGDG.i386.rpm

postgresql-libs-7.3.4-1PGDG.i386.rpm

postgresql-pl-7.3.4-1PGDG.i386.rpm

postgresql-python-7.3.4-1PGDG.i386.rpm

postgresql-server-7.3.4-1PGDG.i386.rpm

postgresql-tcl-7.3.4-1PGDG.i386.rpm

postgresql-test-7.3.4-1PGDG.i386.rpm

[root@linux software]# rpm -Uvh --nodeps `ls -1`

Preparing...                ########################################### [100%]

   1:postgresql-test        ########################################### [  8%]

   2:postgresql             ########################################### [ 17%]

   3:postgresql-contrib     ########################################### [ 25%]

   4:postgresql-debuginfo   ########################################### [ 33%]

   5:postgresql-devel       ########################################### [ 42%]

   6:postgresql-docs        ########################################### [ 50%]

   7:postgresql-jdbc        ########################################### [ 58%]

   8:postgresql-libs        ########################################### [ 67%]

   9:postgresql-pl          ########################################### [ 75%]

  10:postgresql-python      ########################################### [ 83%]

  11:postgresql-server      ########################################### [ 92%]

  12:postgresql-tcl         ########################################### [100%]

[root@linux software]# rpm -qa|grep postgre

postgresql-devel-7.3.4-1PGDG

postgresql-7.3.4-1PGDG

postgresql-python-7.3.4-1PGDG

postgresql-contrib-7.3.4-1PGDG

postgresql-jdbc-7.3.4-1PGDG

postgresql-server-7.3.4-1PGDG

postgresql-debuginfo-7.3.4-1PGDG

postgresql-libs-7.3.4-1PGDG

postgresql-tcl-7.3.4-1PGDG

postgresql-test-7.3.4-1PGDG

postgresql-pl-7.3.4-1PGDG

postgresql-docs-7.3.4-1PGDG

[root@linux software]#

[root@linux software]# service postgresql start

Starting postgresql service:                               [  OK  ]

[root@linux software]# su postgres

bash-2.05b$ createdb

CREATE DATABASE

bash-2.05b$ psql

Welcome to psql 7.3.4, the PostgreSQL interactive terminal.

 

Type:  \copyright for distribution terms

       \h for help with SQL commands

       \? for help on internal slash commands

       \g or terminate with semicolon to execute query

       \q to quit

 

postgres=# \q

bash-2.05b$

bash-2.05b$ vi /var/lib/pgsql/data/postgresql.conf

#========================================================================

 

 

#

#       Connection Parameters

#

#tcpip_socket = false

tcpip_socket = true