# PostgreSQL資料庫
## 關於
#### 簡介
PostgreSQL自1982年開始已開發超過18年,。該專案最初開始於在加利福尼亞大學伯克利分校的Ingres計劃;在系統可靠性、資料完整性和正確性獲得極佳評價;在類似[BSD授權](https://zh.wikipedia.org/wiki/BSD授權)與[MIT授權](https://zh.wikipedia.org/wiki/MIT授權)的PostgreSQL授權下發行,可用於商業行為上。
支援在非常多作業系統上執行,如:Linux、UNIX家族-AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris 與 Tru64和 Windows。
完全符合ISO ACID註,全面支援 Foreign Keys、Joins, Views、Triggers和Stored Procedures(多種程式語言)。 文字方面同時支援國際字元集、多位元組字元編碼。
支援的資料型態有Integer、Numberic、Boolean、Char、Varchar、DAT、, Interval與 Timestamp,也支援儲存二進位(binary)大型檔案,如 圖片、聲音或視訊。原生程式語言支援包含 C/C++、Java、Perl , Python, Ruby、.Net、TCL、ODBC等等,且文件非常完整ㄉ。
支援多種企業級資料庫系統的功能,如多版本並行控制(Multi-Version Concurrency Control), 時間點資料還原(Restore to point in time),表格空間(tablespaces)、非同步資料複製(Asynchronous Replication)、巢狀交易(儲存點)、不需關機的線上(熱)備份、複雜的查詢規劃器/優化、支援容錯能力的優先寫入日誌檔等等功能。
#### PostgreSQL 限制
| 限制 | 值 |
| :--------------------------- | :------------------------------ |
| 最大 Database Size | 無限制 |
| 最大資料庫數量 | 4,294,950,911 |
| 每個資料庫的最大Table數量 | 1,431,650,303 |
| 最大 Table Size | 32 TB (Block size: 8192 bytes) |
| 每個Table最多 Columns | 1600 |
| 最大 Row 大小 | 1.6 TB |
| 最大 Field 大小 | 1 GB |
| 每個Table可儲存最大 Rows數量 | 無限制 |
| 每個Table最大 indexes數量 | 無限制 |
> 出處:https://www.postgresql.org/docs/12/limits.html
#### ACID
ISO/IEC 10026-1:1992 在處理資料變動上對資料庫系統(DBMS)定義了需要具備四個的能力,要求資料庫管理系統在寫入和變動資料的過程中,需要保證資料庫交易(transaction)的正確可靠,定義了需要符合的四個特性:
- 不可分割性(Atomicity)
- 資料一致性(Consistency)
- 獨立性(Isolation)
- 持久性(Durability)
> [PostgreSQL版本功能對照表](https://www.postgresql.org/about/featurematrix/)
#### 下載
##### 下載位址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
> 安裝後可過phAdmin或dbever等資料庫管理工具來操作PostgreSQL
## 實作 - pgAdmin
> 備註:
>
> 進入phAdmin需要輸入在安裝PostgreSQL時設定的master密碼。
#### 連接伺服器(Create Server)
Quick Links -> Add New Server
或
左方Browser -> Servers 點右鍵 -> Create -> Server
> Name欄位:目前這個伺服器設定要顯示的名稱
> Host: 填入localhost (本機)
>
>
#### 建立資料庫
左方Databases 點右鍵 -> Create -> Database
#### 新增Tablse
資料庫內存放資料的地方稱為Table,必須再建立Table才能開始存放資料,建立方式可以透過pgAdmin介面或是直接下SQL語法:
##### 透過phAdmin 4 UI
左邊Browsers -> Servers -> Databases -> {資料庫名稱} -> Schemas -> public -> Tables上點右鍵 -> Create -> Table
##### 直接下SQL語法
在{資料庫名稱}上點右鍵後選擇「Query Tool」,然後使用`CREATE TABLE`指令,語法如下:
```
CREATE TABLE table_name (
column_name1 data_type,
column_name2 data_type,
column_name3 data_type,
···
);
```
例如要建立一個叫「google_trend」的Table,裡面有`id`、`title`、`formattedTraffic`、`relatedQueries`、`image`、`articles`、`shareUrl`和`date`欄位
```
CREATE TABLE google_trend (
id serial PRIMARY KEY,
title varchar(32),
formattedTraffic varchar(32),
relatedQueries text,
imageUrl varchar(1024),
articles text,
shareUrl varchar(1024),
fetch_date int
);
```
> 參考:
>
> PostgreSQL資料型別:https://docs.postgresql.tw/the-sql-language/data-types
## 參考
- [[PostgreSQL 台灣使用者社群](https://postgresql.tw/)]
- [官方教學文件](https://docs.postgresql.tw/tutorial)
## 問題排除
#### ㄧ、在Windows 7 專業版 64位元安裝時出現:「Problem running post-install step.」錯誤。
##### 解決方式:
其實在此時,PostgreSQL 已經安裝完畢了,但沒有伺服器實體 (instance) 在運作。
###### Step 1:
以「系統管理員身分」執行"「命令提示字元」
###### Step 2:
```cd "C:\Program Files\PostgreSQL\10\bin"```
###### Step 3:
初始化伺服器實體
```
initdb -D c:\Users\Arthur\pgdata -U postgres -W -E UTF8 -A scram-sha-256
```
###### Step 4:
啟動伺服器
```
C:\Program Files\PostgreSQL\13\bin> pg_ctl -D c:\Users\{name}\pgdata -I c:\Users\{name}\logfile start
```
> 提示:
> 如果你看到了「waiting for server to start....Access is denied.」錯誤訊息,那可能是`-I`參數後面指定的log檔案路徑有權限問題,把它改到其他地方即可,如範例中的:`c:\User\{name}\logfile