[重要通告]如您遇疑難雜癥,本站支持知識付費(fèi)業(yè)務(wù),掃右邊二維碼加博主微信,可節(jié)省您寶貴時間哦!

以下內(nèi)容包含那些 PostgreSQL 支持的 SQL 命令的信息.這里的 "SQL" 就是該語言通常的含義;

每條命令的與標(biāo)準(zhǔn)有關(guān)的兼容性的信息可以在相關(guān)的參考頁中找到.

(非原創(chuàng),這些玩意,就為了自己好用,木有轉(zhuǎn)載說明,要有也是mssql官方網(wǎng)站)
Table of Contents
ABORT --? 退出當(dāng)前事務(wù)
ALTER GROUP --? 向組中增加用戶或從組中刪除用戶
ALTER USER --? 改變數(shù)據(jù)庫用戶帳號.
ANALYZE --? 收集與數(shù)據(jù)庫有關(guān)的統(tǒng)計
BEGIN --? 開始一個事務(wù)塊
CHECKPOINT -- 強(qiáng)制一個事務(wù)日志檢查點(diǎn)
CLOSE --? 關(guān)閉一個游標(biāo)
CLUSTER --? 根據(jù)一個索引對某個表集簇
COMMENT --? 定義或者改變一個對象的評注
COMMIT --? 提交當(dāng)前事務(wù)
COPY --? 在表和文件之間拷貝數(shù)據(jù)
CREATE AGGREGATE --? 定義一個新的聚集函數(shù)
CREATE CONSTRAINT TRIGGER --? 定義一個新的約束觸發(fā)器
CREATE DATABASE --? 創(chuàng)建新數(shù)據(jù)庫
CREATE FUNCTION --? 定義一個新函數(shù)
CREATE GROUP --? 定義一個新的用戶組
CREATE INDEX --? 定義一個新索引
CREATE LANGUAGE -- 定義一種新的過程語言
CREATE OPERATOR --? 定義一個新的操作符
CREATE RULE --? 定義一個新的重寫規(guī)則
CREATE SEQUENCE --? 創(chuàng)建一個新的序列發(fā)生器
CREATE TABLE --? 定義一個新表
CREATE TABLE AS -- 從一條查詢的結(jié)果中創(chuàng)建一個新表
CREATE TRIGGER --? 定義一個新的觸發(fā)器
CREATE TYPE --? 定義一個新的數(shù)據(jù)類型
CREATE USER --? 創(chuàng)建一個新的數(shù)據(jù)庫用戶帳戶
CREATE VIEW --? 定義一個視圖
DECLARE --? 定義一個游標(biāo)
DELETE --? 刪除一個表中的行
DROP AGGREGATE --? 刪除一個用戶定義的聚集函數(shù)
DROP DATABASE --? 刪除一個數(shù)據(jù)庫.
DROP FUNCTION --? 刪除一個用戶定義的函數(shù)
DROP GROUP --? 刪除一個用戶組
DROP INDEX --? 刪除一個索引
DROP LANGUAGE --? 刪除一個用戶定義的過程語言
DROP OPERATOR --? 刪除一個用戶定義操作符
DROP RULE --? 刪除一個重寫規(guī)則
DROP SEQUENCE --? 刪除一個序列
DROP TABLE --? 刪除一個表
DROP TRIGGER --? 刪除一個觸發(fā)器定義.
DROP TYPE --? 刪除一個用戶定義數(shù)據(jù)類型
DROP USER --? 刪除一個數(shù)據(jù)庫用戶帳號
DROP VIEW --? 刪除一個視圖
END --? 提交當(dāng)前的事務(wù)
EXPLAIN --? 顯示語句執(zhí)行規(guī)劃
FETCH --? 用游標(biāo)從表中抓取行
GRANT --? 定義訪問權(quán)限
INSERT --? 在表中創(chuàng)建新行
LISTEN --? 監(jiān)聽一個通知
LOAD -- 裝載或重載一個共享庫文件
LOCK --? 明確地鎖定一個表
MOVE --? 把游標(biāo)放到表中的特定的行
NOTIFY --? 生成一個通知
REINDEX --? 恢復(fù)一個損壞了的索引
RESET -- 把一個運(yùn)行時參數(shù)值恢復(fù)為缺省值
REVOKE --? 刪除訪問權(quán)限.
ROLLBACK --? 退出當(dāng)前事務(wù)
SELECT --? 從表或視圖中取出若干行.
SELECT INTO --? 從一個查詢的結(jié)果中創(chuàng)建一個新表
SET -- 改變運(yùn)行時參數(shù)
SET CONSTRAINTS -- 設(shè)置當(dāng)前事務(wù)的約束模式
SET SESSION AUTHORIZATION --? 為當(dāng)前會話設(shè)置會話用戶標(biāo)識符和當(dāng)前用戶標(biāo)識符
SET TRANSACTION -- 設(shè)置當(dāng)前事務(wù)的特性
SHOW -- 顯示運(yùn)行時參數(shù)的數(shù)值
TRUNCATE --? 清空一個表
UNLISTEN --? 停止監(jiān)聽通知信息
UPDATE --? 更新一個表中的行
VACUUM --? 垃圾收集以及可選地分析一個數(shù)據(jù)庫

----------------------------------------------------------------------------
----

ABORT 退出當(dāng)前事務(wù)
ABORT?? Name
ABORT? --? 退出當(dāng)前事務(wù)
Synopsis
ABORT [ WORK | TRANSACTION ]
輸入

輸出
ROLLBACK???????? 成功的返回信息.
NOTICE: ROLLBACK: no transaction in progress
如果當(dāng)前沒有任何正在處理的事務(wù)存在.
描述
ABORT回卷當(dāng)前事務(wù)并且廢棄所有當(dāng)前事務(wù)中做的更新. 這個命令和 命令 ROLLBACK
完全一樣, 只是由于歷史原因而保留下來.
注意
用COMMIT語句可以成功地結(jié)束/提交一個事務(wù).
用法
取消所有更改:
ABORT WORK;
兼容性 SQL92
此命令是 PostgreSQL 基于歷史原因做的擴(kuò)展. ROLLBACK 是 中等價的命令.

----------------------------------------------------------------------------
----

ALTER GROUP向組中增加用戶或從組中刪除用戶
ALTER GROUP
Name
ALTER GROUP? --? 向組中增加用戶或從組中刪除用戶
Synopsis
ALTER GROUP name ADD USER username [, ... ]
ALTER GROUP name DROP USER username [, ... ]
輸入
Name
要更改的組名稱。
Username
準(zhǔn)備向組中增加或從組中刪除的用戶名。用戶名必須已經(jīng)存在。
輸出
ALTER GROUP
更改成功的返回信息。
描述
ALTER GROUP用于向組中增加用戶或者從組中刪除用戶。 只有數(shù)據(jù)庫超級用戶才能使用
這條命令。向組中增加用戶并不創(chuàng)建用戶。同樣從組中刪除用戶也不刪除用戶本身。
使用 CREATE GROUP創(chuàng)建新組以及 DROP GROUP刪除一個組。
用法
向組中增加用戶:
ALTER GROUP staff ADD USER Karl, john;
從組中刪除用戶:
ALTER GROUP workers DROP USER Beth;
兼容性 SQL92
里沒有 ALTER GROUP 語句。角色(roles)的概念與之類似。

----------------------------------------------------------------------------
----

ALTER TABLE修改表的定義
ALTER TABLE
Name
ALTER TABLE? --? 修改表的定義
Synopsis
ALTER TABLE [ ONLY ] table [ * ]
ADD [ COLUMN ] column type [ column constraint [ ... ] ]

ALTER TABLE [ ONLY ] table [ * ]
ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }
ALTER TABLE [ ONLY ] table [ * ]
ALTER [ COLUMN ] column SET STATISTICS integer
ALTER TABLE [ ONLY ] table [ * ]
RENAME [ COLUMN ] column TO new column
ALTER TABLE
RENAME TO new table
ALTER TABLE
ADD table constraint definition
ALTER TABLE [ ONLY ] table
DROP CONSTRAINT constraint
{ RESTRICT | CASCADE }
ALTER TABLE table
OWNER TO new owner

輸入
table
試圖更改的現(xiàn)存表的名稱.
column
現(xiàn)存或新的列名稱.
type
新列的類型.
newcolumn
現(xiàn)存列的新名稱.
new table
表的新名稱.
table constraint definition
表的新的約束定義.
New user
該表的新所有者的用戶名.
輸出
ALTER
從被改名的列或表返回的信息.
ERROR
如果一個列或表不存在返回的信息.
描述
ALTER TABLE變更一個現(xiàn)存表的定義.
ADD COLUMN形式使用與 CREATE TABLE一樣的語法向表中增加一個新列/字段。
ALTER COLUMN SET/DROP DEFAULT形式允許你從列/字段中設(shè)置或者刪除缺?。ㄖ担?br /> 注意缺?。ㄖ担┲贿m用于隨后的 INSERT 命令。 它們不會改變已經(jīng)存在于表中的行.
ALTER COLUMN SET STATISTICS形式允許你為 隨后的 ANALYZE 操作 設(shè)置收集統(tǒng)計信
息的對象.
RENAME 子句可以在不影響任何相關(guān)數(shù)據(jù)的情況下更改 一個表,字段,索引或者序列名
稱。因此, 在此命令執(zhí)行后數(shù)據(jù)仍將是相同尺寸和類型。
ADD table constraint definition子句使用與 CREATE TABLE一樣的語法向表中增加一
個新的約束。
DROP CONSTRAINT constraint子句刪除所有表上匹配 constraint 的 CHECK 約束(以及
其子表)
OWNER 把該表的所有者改為用戶 new user.
如果要改變表的綱要,你必須是表的所有者.
注意
COLUMN 關(guān)鍵字是多余的,可以省略.
在目前的 ADD COLUMN實(shí)現(xiàn)里還不支持 新列/字段的缺?。ㄖ担┖?NOT NULL 子句。不
過你可以隨后用 ALTER TABLE 的 SET DEFAULT 形式設(shè)置缺?。ㄖ担#憧赡苓€想用
UPDATE 把已存在行更新為缺省值。)
目前只有 CHECK 約束可以從表中刪除.RESTRICT 關(guān)鍵字是必須的,盡管 并不檢查依
賴性.還不支持 CASCADE 選項(xiàng).要刪除一個 PRIMARY 或者 UNIQUE 約束,用 DROP
INDEX 命令刪除相關(guān)的索引. 要刪除 FOREIGN KEY 約束,你需要重新創(chuàng)建并重新裝載
該表, 創(chuàng)建的時候使用 CREATE TABLE命令的其它參數(shù).
比如,要刪除在表 distributors 上的所有約束∶
CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors AS SELECT * FROM temp;
DROP TABLE temp;

要修改表的結(jié)構(gòu),你必須是表的所有人。不允許更改系統(tǒng)表結(jié)構(gòu)的任何部分。
PostgreSQL 用戶手冊里有關(guān)于繼承的更多信息.
請參考CREATE TABLE 部分獲取更多有效參數(shù)的描述.
用法
向表中增加一個 varchar 列:
ALTER TABLE distributors ADD COLUMN address VARCHAR(30);
對現(xiàn)存列改名:
ALTER TABLE distributors RENAME COLUMN address TO city;
更改現(xiàn)存表的名字∶
ALTER TABLE distributors RENAME TO suppliers;
給一個表增加一個檢查約束∶
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) =
5);
刪除一個表和它的所有子表的監(jiān)查約束∶
ALTER TABLE distributors DROP CONSTRAINT zipchk;
向表中增加一個外鍵約束:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address)
REFERENCES addresses(address) MATCH FULL;
給表增加一個(多字段)唯一約束∶
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id,
zipcode);
兼容性 SQL92
ADD COLUMN 形式是兼容的,除了上面說的缺?。ㄖ担┖?NOT NULL 約束外。 ALTER
COLUMN 形式是完全兼容的。
對 ALTER TABLE 聲明了一些附加的 PostgreSQL 目前還不直接支持的功能:
ALTER TABLE table DROP [ COLUMN ] column { RESTRICT | CASCADE }

從一個表中刪除一個列. 目前,要刪除一個現(xiàn)存的列,表必須重新創(chuàng)建和重新裝載:
CREATE TABLE temp AS SELECT did, city FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors (
did????? DECIMAL(3) DEFAULT 1,
name???? VARCHAR(40) NOT NULL
);
INSERT INTO distributors SELECT * FROM temp;
DROP TABLE temp;

重命名表,列/字段,索引,和序列的名字是 PostgreSQL 對 的擴(kuò)展。

----------------------------------------------------------------------------
----

ALTER USER
ALTER USER
Name
ALTER USER? --? 改變數(shù)據(jù)庫用戶帳號.
Synopsis
ALTER USER username [ [ WITH ] option [ ... ] ]
這里 option 可以是∶
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| VALID UNTIL 'abstime'
輸入
username
想進(jìn)行更改的用戶的名字。
[ encrypted | unencrypted ] password
此帳號所使用的新口令。 Encrypted/ unencrypted 控制該口令在數(shù)據(jù)庫里是否以加密
形式存儲.
CREATEDB
NOCREATEDB
這個子句定義該用戶創(chuàng)建數(shù)據(jù)庫的能力。 如果聲明了 CREATEDB,該用戶可以創(chuàng)建她自
己的數(shù)據(jù)庫。用 NOCREATEDB 將剝奪一個用戶創(chuàng)建數(shù)據(jù)庫的能力。
CREATEUSER
NOCREATEUSER
這個子句決定一個用戶能否創(chuàng)建新用戶。 這個選項(xiàng)同樣還令該用戶成為超級用戶,可
以超越所有訪問限制。
abstime
該用戶帳號口令的有效日期(和可選的時間)。
輸出
ALTER USER
更改成功的返回信息.
ERROR: ALTER USER: user "username" does not exist
如果數(shù)據(jù)庫不認(rèn)識你所聲明的用戶返回的信息.
描述
ALTER USER用于更改用戶的 PostgreSQL 帳號的屬性.沒有在該命令中出現(xiàn)的屬性保持
原值.
只有一個數(shù)據(jù)庫超級用戶可以用這個命令更改權(quán)限和口令有效期。 普通用戶只能更改
他們自己的口令。
ALTER USER無法改變一個用戶的組的成員性. 用 ALTER GROUP實(shí)現(xiàn)這個目地.
使用 CREATE USER創(chuàng)建新用戶和 DROP USER刪除用戶。
用法
更改一用戶口令:
ALTER USER divide WITH PASSWORD 'hu8jmn3';
更改一用戶有效期
ALTER USER Manuel VALID UNTIL 'Jan 31 2030';
更改一用戶有效期, 聲明其權(quán)限應(yīng)該在用比UTC早一小時的時區(qū)記時的1998年5月4日正
午失效
ALTER USER Chris VALID UNTIL 'May 4 12:00:00 1998 +1';
賦予一用戶創(chuàng)建新用戶和新數(shù)據(jù)庫的權(quán)限:
ALTER USER Miriam CREATEUSER CREATEDB;
兼容性 SQL92
里沒有 ALTER USER. 該標(biāo)準(zhǔn)將用戶定義部分交給具體數(shù)據(jù)庫實(shí)現(xiàn)處理.

----------------------------------------------------------------------------
----

ANALYZE
ANALYZE
Name
ANALYZE? --? 收集與數(shù)據(jù)庫有關(guān)的統(tǒng)計
Synopsis
ANALYZE [ VERBOSE ] [ table [ (column [, ...] ) ] ]
輸入
VERBOSE
打開處理過程信息的顯示.
table
要分析的特定表的名字.缺省是所有表.
column
要分析的特定行的名字.缺省是所有列.
輸出
ANALYZE
命令已經(jīng)結(jié)束了.
描述
ANALYZE收集有關(guān) PostgreSQL 表的內(nèi)容的統(tǒng)計,然后把結(jié)果保存在系統(tǒng)表
pg_statistic 里.隨后,查詢規(guī)劃器就可以使用這些統(tǒng)計幫助判斷查詢的最有效的 規(guī)
劃.
如果沒有參數(shù),ANALYZE 檢查在當(dāng)前數(shù)據(jù)庫里的所有 表.如果有參數(shù),ANALYZE 只檢
查那個表. 你還可以給出一列字段名字,這個時候只有那些字段的統(tǒng)計信息被更新.
注意
周期性地運(yùn)行 ANALYZE,或者在對表的 大部分內(nèi)容做了更改之后馬上運(yùn)行它是個好習(xí)
慣,準(zhǔn)確的統(tǒng)計信息將幫助規(guī)劃器選擇最合適的查詢規(guī)劃,并因此 而改善查詢處理的
速度.一種比較經(jīng)常采用的策略是每天在 低負(fù)荷的時候運(yùn)行一次 VACUUM和 ANALYZE.

和 VACUUM FULL 不同的是, ANALYZE 只需要在目標(biāo)表上有一個讀取鎖, 因此它可以
和表上的其它活動并行地運(yùn)行.
對于大表,ANALYZE 采集表內(nèi)容的一個隨機(jī)的抽樣做 統(tǒng)計,而不是檢查每一行.這樣
即使是很大的表,我們也只需要很少的一些 時間就可以完成分析.不過要注意的是統(tǒng)
計只是近似的結(jié)果,而且每次運(yùn)行ANALYZE都會有一些小變化,即使表內(nèi)容實(shí)際上 沒有
改變也這樣.這樣會導(dǎo)致 EXPLAIN 所顯示的 規(guī)劃器計算的開銷有一些小變化,
收集的統(tǒng)計信息通常包括一個每字段最常用數(shù)值的列表以及 一個包線圖,顯示每個字
段里數(shù)據(jù)的近似分布.如果 ANALYZE 認(rèn)為它們都沒有什么用, (比如,在一個唯一鍵
字的字段上沒有公共的數(shù)值) 或者是該字段數(shù)據(jù)類型不支持相關(guān)的操作符,那么它們都
可以忽略.在用戶手冊 中有關(guān)于統(tǒng)計的更多信息.
分析的廣度可以通過用 ALTER TABLE ALTER COLUMN SET STATISTICS (參閱 ALTER
TABLE調(diào)整每字段的統(tǒng)計目標(biāo)來控制.目標(biāo)數(shù)值設(shè)置最常用數(shù)值列表中的記錄的最大數(shù)
目以及包線圖中的最大塊數(shù).缺省的目標(biāo)數(shù)值是 10,不過我們可以調(diào)節(jié) 這個數(shù)值獲取
規(guī)劃器計算精度和 ANALYZE 運(yùn)行所需要的 時間以及 pg_statistic 里面占據(jù)的空間數(shù)
目之間的 平衡.特別是,把統(tǒng)計目標(biāo)設(shè)置為零就關(guān)閉了該字段的統(tǒng)計收集. 對那些從
來不參與到查詢的 WHERE,GROUP BY,或者 ORDER BY 子句里的字段 是很有用的,因
為規(guī)劃器不會使用到這樣的字段上的統(tǒng)計. )
在被分析的字段中最大的統(tǒng)計目標(biāo)決定為統(tǒng)計采樣的表中的行的數(shù)目. 增大目標(biāo)會導(dǎo)
致做 ANALYZE 的時候成比例地 增大對時間和空間的需求.
兼容性 SQL92
里沒有 ANALYZE 語句.

----------------------------------------------------------------------------
----

BEGIN
BEGIN
Name
BEGIN? --? 開始一個事務(wù)塊
Synopsis
BEGIN [ WORK | TRANSACTION ]
輸入
WORK
TRANSACTION
可選關(guān)鍵字。沒什么作用。
輸出
BEGIN
這表明一個新的事務(wù)已經(jīng)開始.
NOTICE: BEGIN: already a transaction in progress
這表明該事務(wù)已經(jīng)運(yùn)行,當(dāng)前事務(wù)不受影響.
描述
缺省時,PostgreSQL 以 非鏈接模式(unchained mode) (在其他數(shù)據(jù)庫系統(tǒng)里也稱
之為"自動提交("autocommit"))"。 換句話說,每個用戶語句都是在其自身的事務(wù)
中運(yùn)行并且在語句結(jié)束時隱含的調(diào)用一個提交(commit)(如果執(zhí)行成功則提交,否則
調(diào)用一個回卷)。 BEGIN 以鏈接模式(chained mode)初始化一個用戶事務(wù),也就是
說所有 BEGIN 命令后的用戶語句都將在一個事務(wù)里面執(zhí)行直到一個明確的 COMMIT,
ROLLBACK, 或執(zhí)行退出(abort)。在鏈接模式里執(zhí)行的語句很明顯地快得多,因?yàn)槭?br /> 務(wù)開始/提交(start/commit)需要大量的CPU和磁盤活動。在一個 事務(wù)內(nèi)部執(zhí)行多條
語句時因?yàn)榭赡苄薷娜舾蓚€相關(guān)的表因而同樣需要一致性。
在 PostgreSQL 里缺省的事務(wù)隔離級別是 READ COMMITTED, 這時在事務(wù)內(nèi)部的查詢只
看到查詢提交之前的(數(shù)據(jù))修改。 所以,如果你需要更嚴(yán)格的事務(wù)隔離,你必須在
BEGIN 后馬上使用 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE。 在
SERIALIZABLE 模式里,查詢將只能看到整個事務(wù)開始之前的修改。 (實(shí)際上是在一個
可串行化事務(wù)內(nèi)部第一個 DML 語句執(zhí)行前的數(shù)據(jù))。
如果提交了事務(wù), PostgreSQL 將保證要么實(shí)現(xiàn)所有更新, 要么所有更新都沒有實(shí)
現(xiàn)。事務(wù)有標(biāo)準(zhǔn)的 ACID (原子性,一致性,隔離性,持續(xù)性) (atomic,
consistent,isolatable,and durable)屬性。
注意
請參考 LOCK語句獲取關(guān)于在事務(wù)內(nèi)部鎖定一個表的詳細(xì)信息.
使用 COMMIT或者 ROLLBACK結(jié)束一個事務(wù).
用法
開始一個用戶事務(wù):
BEGIN WORK;
兼容性 SQL92
BEGIN是 PostgreSQL 語言的擴(kuò)展. 在 中沒有明確的 BEGIN 的定義;事務(wù)初始化總是
隱含的而且使用一個 COMMIT 或者 ROLLBACK 語句終止.
注意: 許多關(guān)系型數(shù)據(jù)庫為了方便提供一個自動提交(autocommit)特性。
順便說一句,BEGIN 關(guān)鍵字在嵌入 SQL 里用于不同的目的。 我們建議你在移植數(shù)據(jù)庫
應(yīng)用時仔細(xì)檢查事務(wù)的語意。
還要求事務(wù)的缺省隔離級別是 SERIALIZABLE。
CHECKPOINT
CHECKPOINT
Name
CHECKPOINT -- 強(qiáng)制一個事務(wù)日志檢查點(diǎn)
Synopsis
CHECKPOINT
描述
預(yù)寫式日志(Write-Ahead Logging (WAL))缺省時在事務(wù)日志中每隔一段時間放一個
檢查點(diǎn).(要調(diào)整這個原子化的檢查點(diǎn)間隔, 你可以參考運(yùn)行時 選項(xiàng)
CHECKPOINT_SEGMENTS 和 CHECKPOINT_TIMEOUT .) CHECKPOINT 強(qiáng)迫在命令聲明時立
即進(jìn)行檢查, 而不是等到下一次調(diào)度時的檢查點(diǎn).
檢查點(diǎn)是一個事務(wù)日志訓(xùn)練中的點(diǎn),在該點(diǎn),所有數(shù)據(jù)文件都被更新 以反映日志中的
信息.所有數(shù)據(jù)文件都將被沖刷到磁盤.請參考 PostgreSQL 管理員手冊獲取更多有關(guān)
WAL 系統(tǒng)的信息.
只有超級用戶可以調(diào)用 CHECKPOINT. 該命令不是設(shè)計用于正常操作過程中的.
又見
PostgreSQL 管理員手冊
兼容性 SQL92
CHECKPOINT命令是 PostgreSQL 語言的擴(kuò)展.

----------------------------------------------------------------------------
----

CLOSE
CLOSE
Name
CLOSE? --? 關(guān)閉一個游標(biāo)
Synopsis
CLOSE cursor
輸入
cursor?????? 一個待關(guān)閉的游標(biāo)的名字.
輸出
CLOSE? 游標(biāo)關(guān)閉成功返回的信息.
NOTICE PerformPortalClose: portal "cursor" not found
如果該 cursor 沒有聲明或已經(jīng)關(guān)閉,返回該信息.
描述
CLOSE釋放和一個游標(biāo)關(guān)聯(lián)的資源. 一個游標(biāo)關(guān)閉后,不允許對其再做任何操作.一個
不再使用的游標(biāo)應(yīng)該關(guān)閉掉.
如果用 COMMIT 或 ROLLBACK 提交了一個事務(wù),將對每個打開的游標(biāo)執(zhí)行隱含的關(guān)閉操
作.
注意
PostgreSQL 沒有明確的 OPEN (打開)游標(biāo)的語句; 我們認(rèn)為一個游標(biāo)在聲明時就打
開了.使用 DECLARE 語句聲明一個游標(biāo).
用法
關(guān)閉游標(biāo)liahona:
CLOSE liahona;
兼容性 SQL92
CLOSE與 完全兼容.

----------------------------------------------------------------------------
----

CLUSTER
Name
CLUSTER? --? 根據(jù)一個索引對某個表集簇
Synopsis
CLUSTER indexname ON table name

輸入
indexname
一個索引名稱.
table
準(zhǔn)備建簇的表的名稱.
輸出
CLUSTER
成功建簇.
ERROR: relation <tablerelation_number> inherits "table"
ERROR: Relation table does not exist!
描述
CLUSTER指示PostgreSQL 近似地基于索引 indexname 的度量對表 table 進(jìn)行存儲建
簇. 索引必須已經(jīng)在表 table name. 上定義了.
當(dāng)對一個表建簇后,該表的物理存儲將基于索引信息進(jìn)行. 建簇是靜態(tài)的,也就是
說,當(dāng)表被更新后,改變的內(nèi)容不會建簇. 不會試圖對更新過的記錄重新建簇.如果
需要,可以通過手工執(zhí)行該命令的方法重建簇.
注意
該表實(shí)際上按索引順序拷貝到了一個臨時表中,然后重新改成原名. 因此,在建簇時
所有賦予的權(quán)限和其它索引都將丟失.
如果你只是隨機(jī)的訪問表中的行, 那么在堆表中的數(shù)據(jù)的實(shí)際存儲順序是無關(guān)緊要
的. 但是,如果你對某些數(shù)據(jù)的訪問多于其他數(shù)據(jù),而且有一個索引將這些數(shù)據(jù)分
組,那你就將從 使用 CLUSTER 中獲益.
另一個CLUSTER 很有幫助的例子是當(dāng)你用索引從一個表中取出幾個記錄時. 如果你從一
個表中請求一定索引范圍的值,或者是一個索引過的值對應(yīng)多行, CLUSTER 也會有助
于應(yīng)用,因?yàn)槿绻饕龢?biāo)識出第一匹配行所在的堆存儲頁,所有 其他行也可能已經(jīng)在
同一堆存儲頁里了, 這樣便節(jié)省了磁盤訪問的時間,加速了查詢.
有兩種建簇的數(shù)據(jù).第一種是用 CLUSTER 命令,此命令將原表按你聲明的索引重新排
列. 這個動作在操作大表時可能會很慢, 因?yàn)槊恳恍卸紡亩汛鎯摾锇此饕樞蛉?br /> 出,如果存儲頁表沒有排序,整個表是隨機(jī)存放在各個頁面的,因而每行都要進(jìn)行依次
磁盤頁面操作. PostgreSQL 有一個緩沖, 但一個大表的主體是不可能都放到緩沖去
的.
另一個對數(shù)據(jù)建簇的方法是使用
SELECT column list INTO TABLE new table
FROM table ORDER BY column list

這個用法使用PostgreSQL 排序的代碼 ORDER BY 來匹配索引,在對未排序的數(shù)據(jù)操作
時速度快得多. 然后你可以刪除舊表,用 ALTER TABLE...RENAME將 new table 改成
舊表名, 并且重建該表所有索引.唯一的問題是 OID 將不保留.這時再做 CLUSTER
將快得多, 因?yàn)榇蠖鄶?shù)堆棧數(shù)據(jù)已經(jīng)排過序了而且使用現(xiàn)有的索引.
用法
以雇員的薪水屬性對雇員關(guān)系建簇.
CLUSTER emp_ind ON emp;
兼容性 SQL92
在 規(guī)范里沒有 CLUSTER 語句.

----------------------------------------------------------------------------
----

COMMENT
COMMENT
Name
COMMENT? --? 定義或者改變一個對象的評注
Synopsis
COMMENT ON
[
[ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ] object_name |
COLUMN table_name.column_name|
AGGREGATE agg_name agg_type|
FUNCTION func_name (arg1, arg2, ...)|
OPERATOR op (leftoperand_type rightoperand_type) |
TRIGGER trigger_name ON table_name
] IS 'text'
輸入
object_name, table_name, column_name, agg_name, func_name, op, trigger_name
要加入評注的對象名稱.
text
要加入的評注.
輸出
COMMENT???? 成功對表評注后的返回.
描述
COMMENT存儲一個數(shù)據(jù)庫對象的評注, 這個評注可以很容易用 psql的 /dd或 /d+ 或者
/l+ 命令檢索出來.其它檢索評注的用戶接口可以建設(shè)在 psql 所用地同樣地內(nèi)部函數(shù)
的基礎(chǔ)上,也就是 obj_description() 和 col_description().
要修改一個評注,為同一個對象發(fā)出一條新的 COMMENT 命令即可.每個對象只存儲一
條評注. 要刪除評注,在文本字串的位置寫上 NULL.當(dāng)刪除對象時,評注自動被刪除
掉.
需要說明的是目前評注沒有安全機(jī)制∶任何聯(lián)接到某數(shù)據(jù)庫上地用戶 都可以看到所有
該數(shù)據(jù)庫對象地評注(盡管只有超級用戶可以修改 不屬于它地對象的評注).因此,不
要在評注里放安全性敏感地信息.
用法
給表mytable 加評注:
COMMENT ON mytable IS 'This is my table.';
一些例子:
COMMENT ON DATABASE my_database IS 'Development Database';
COMMENT ON INDEX my_index IS 'Enforces uniqueness on employee id';
COMMENT ON RULE my_rule IS 'Logs UPDATES of employee records';
COMMENT ON SEQUENCE my_sequence IS 'Used to generate primary keys';
COMMENT ON TABLE my_table IS 'Employee Information';
COMMENT ON TYPE my_type IS 'Complex Number support';
COMMENT ON VIEW my_view IS 'View of departmental costs';
COMMENT ON COLUMN my_table.my_field IS 'Employee ID number';
COMMENT ON AGGREGATE my_aggregate (double precision) IS 'Computes sample
variance';
COMMENT ON FUNCTION my_function (timestamp) IS 'Returns Roman Numeral';
COMMENT ON OPERATOR ^ (text, text) IS 'Performs intersection of two text';
COMMENT ON TRIGGER my_trigger ON my_table IS 'Used for R.I.';
兼容性 SQL92
里沒有COMMENT.

----------------------------------------------------------------------------
----

COMMIT
COMMIT
Name
COMMIT? --? 提交當(dāng)前事務(wù)
Synopsis
COMMIT [ WORK | TRANSACTION ]
輸入
WORK
TRANSACTION
可選關(guān)鍵字。沒有作用。
輸出
COMMIT
提交成功返回此信息.
NOTICE: COMMIT: no transaction in progress
如果過程中沒有事務(wù),返回此信息.
描述
COMMIT提交當(dāng)前事務(wù). 所有事務(wù)的更改都將為其他事務(wù)可見,而且保證當(dāng)崩潰發(fā)生時
的可持續(xù)性.
注意
關(guān)鍵字 WORK 和 TRANSACTION 都可以忽略.
使用 ROLLBACK語句退出一次事務(wù).
用途
要讓所有變更永久化:
COMMIT WORK;
兼容性 SQL92
只聲明了兩種形式 COMMIT 和 COMMIT WORK。否則完全兼容。

----------------------------------------------------------------------------
----

COPY
COPY
Name
COPY? --? 在表和文件之間拷貝數(shù)據(jù)
Synopsis
COPY [ BINARY ] table [ WITH OIDS ]??? FROM { 'filename' | stdin }??? [
[USING] DELIMITERS 'delimiter' ]??? [ WITH NULL AS 'null string' ]COPY [
BINARY ] table [ WITH OIDS ]??? TO { 'filename' | stdout }??? [ [USING]
DELIMITERS 'delimiter' ]??? [ WITH NULL AS 'null string' ] 輸入
BINARY
改變字段格式行為,強(qiáng)制所有數(shù)據(jù)都使用二進(jìn)制格式存儲和讀取, 而不是以文本的方
式. DELIMITERS 和 WITH NULL 選項(xiàng)和二進(jìn)制格式無關(guān).
table
現(xiàn)存表的名字.
WITH OIDS
拷貝每行的內(nèi)部唯一對象標(biāo)識(OID).
filename
輸入或輸出的 Unix 文件的絕對文件名.
stdin
聲明輸入是來自客戶端應(yīng)用.
stdout
聲明輸入前往客戶端應(yīng)用.
delimiter
用于在文件中每行中分隔各個字段的字符.
null string
個代表 NULL 值的字串。缺省是 "/N" (反斜杠-N)。 當(dāng)然,你可以自己挑一個空字
串。
注意: 對于拷貝入(copy in),任何匹配這個字串的字串將被存儲為 NULL 值, 所以
你應(yīng)該確保你用 的字串和拷貝出(copy out)相同。
輸出
COPY
拷貝成功完成.
ERROR: reason
拷貝失敗,原因在錯誤信息里.
描述
COPY在 PostgreSQL表和標(biāo)準(zhǔn)文件系統(tǒng)文件之間交換數(shù)據(jù). COPY TO 把一個表的所有內(nèi)
容都拷貝到一個文件, 而 COPY FROM 從一個文件里拷貝數(shù)據(jù)到一個表里 (把數(shù)據(jù)附
加到表中已經(jīng)存在的內(nèi)容里).
COPY指示 PostgreSQL 后端直接從文件中讀寫數(shù)據(jù).如果聲明了文件名,那么該文件必
須為后 端可見,而且文件名必須從后端的角度聲明.如果聲明的是 stdin 或
stdout, 數(shù)據(jù)通過客戶前端流到后端.
小提示: 不要把 COPY 和 psql 指令 /copy 混淆在一起. /copy 調(diào)用 COPY FROM
stdin 或 COPY TO stdout,然后抓取/存儲 psql 客戶端可以訪問的一個文件里. 因
此,使用 /copy 的時候, 可訪問性和訪問權(quán)限取決于客戶端而不是服務(wù)器端.
注意
BINARY 關(guān)鍵字將強(qiáng)制使用二進(jìn)制對象而不是文本存儲/讀取所有數(shù)據(jù). 這樣做在一定
程度上比傳統(tǒng)的拷貝命令快,但二進(jìn)制拷貝文件在不同機(jī)器體系間的植性不是很好.
缺省地,文本拷貝使用 tab ("/t")字符作為分隔符. 分隔符仍然可以用關(guān)鍵字
USING DELIMITERS 改成任何其它的字符. 在數(shù)據(jù)中碰巧與分隔符相同的字符將用反斜
扛引起.
你對任何要COPY 出來的數(shù)據(jù)必須有select 權(quán)限,對任何要 COPY 入數(shù)據(jù)的表必須有
insert 或 update 權(quán)限. 使用 COPY 時后端同樣需要適當(dāng)?shù)膶ξ募僮鞯?Unix 權(quán)
限.
COPY TO不會激活規(guī)則,也不會處理字段缺省值。不過它的確激活觸發(fā)器和檢查約束。
COPY在第一個錯誤處停下來.這些在 COPY FROM中不應(yīng)該導(dǎo)致問題,但在 COPY TO 時
目的表會已經(jīng)接收到早先的行, 這些行將不可見或不可訪問,但是仍然會占據(jù)磁盤空
間. 如果你碰巧是拷貝很大一塊數(shù)據(jù)文件的話,積累起來,這些東西可能會占據(jù)相當(dāng)
大的一部分磁盤空間. 你可以調(diào)用 VACUUM來恢復(fù)那些磁盤空間.
COPY命令里面的文件必須是可以由后端直接讀或?qū)懙奈募?,而不是由客戶端?yīng)用讀寫.
因此,它們必須位于數(shù)據(jù)庫服務(wù)器上或者可以為數(shù)據(jù)庫服務(wù)器所訪問, 而不是由客戶
端做這些事情. 它們必須是PostgreSQL用戶(服務(wù)器運(yùn)行的用戶 ID) 可以訪問到并
且 可讀或者可寫,而不是客戶端. COPY 到一個命名文件是只允許數(shù)據(jù)庫超級用戶進(jìn)
行的, 因?yàn)樗试S寫任意后端有權(quán)限寫的文件.
小技巧: psql指令 /copy 以客戶的權(quán)限讀或?qū)懺诳蛻舳说奈募?,因此不局限于超級?br /> 戶.
我們建議在 COPY 里的文件名字總是使用 絕對路徑.在 COPY TO 的時候是由后端強(qiáng)制
進(jìn)行的,但是對于 COPY FROM,你的確有從一個聲明為相對路徑的文件里讀取的選
擇.該路徑將解釋為相對于后端的 工作目錄(在 $PGDATA 里的什么地方), 而不是
客戶端的工作目錄.
文件格式
文本格式
當(dāng)不帶 BINARY 選項(xiàng)使用 COPY TO 時, 生成的文件每條元組占據(jù)一行,每列(字段)
用分隔符分開.內(nèi)嵌的分隔符字 符將由一個反斜杠("/")開頭. 字段值本身是由與
每個字段類型相關(guān)的輸出函數(shù)生成的字符串.某一類型的輸出函數(shù)本身不應(yīng)該生成反斜
杠;這個任務(wù)由 COPY 本身完成.
每個元組的實(shí)際格式是
<attr1><separator><attr2><separator>...<separator><attrn><newline>??? 請注意
每行的結(jié)尾是用 Unix 風(fēng)格的換行符("/n")標(biāo)記的. 如果給出的文件包含 DOS 或
Mac 風(fēng)格的換行符,那么 COPY FROM 將會出錯.
如果聲明了 WITH OIDST,它將被放在每行的開頭.
如果 COPY TO 將它的輸出輸出到標(biāo)準(zhǔn)輸出而不是一個文件, 在拷貝結(jié)束時,它將在一
個新行上輸出一個反斜杠("/")和一 個句點(diǎn)("."),最后是一個換行符做為文件結(jié)
束符.類似,如果 COPY FROM 從標(biāo)準(zhǔn)輸入讀入數(shù)據(jù),它將把一行開頭的由一個 反斜杠
("/")和一個句點(diǎn)(".")和一個換行符組成的這三個連續(xù)字符作為文件結(jié)束符. 不
過,如果在這個特殊的文件結(jié)束模式出現(xiàn) 前關(guān)閉了輸入聯(lián)接,那么COPY FROM 將正確
結(jié)束(接著就是后端自身).
反斜杠有其他的含義.一個文本反斜杠字符輸出成兩個連續(xù)的反斜杠 ("http://") 一個文
本tab字符用一個反斜 杠后面跟一個tab代表. (如果你使用了非 tab 作為列分隔符,
那么在數(shù)據(jù)中出現(xiàn)的該字符將會使用反斜扛轉(zhuǎn)意.) 一個文本新行字符用一個反斜杠和
一個新行代表. 當(dāng)裝載不是由 PostgreSQL 生成的文件時,你需要將反 斜杠字符
("/")轉(zhuǎn)換成雙反斜杠("http://")以保證正確裝載.
二進(jìn)制格式
在PostgreSQLv7.1 中的 COPY BINARY 的文件格式做了變化.新格式由一個文件頭,零
或多條元組, 以及文件尾組成.
文件頭
文件頭由 24 個字節(jié)的固定域組成,后面跟著一個變長的頭擴(kuò)展區(qū).固定域是:
簽名
12-字節(jié)的序列 "PGBCOPY/n/377/r/n/0" --- 請注意空是簽名是要求的一部分.(使用
這個簽名是為了讓我們能夠很容易看出文件是否已經(jīng)被一個非 8 位安全的轉(zhuǎn)換器給糟
蹋了.這個簽名會被換行符轉(zhuǎn)換過濾器,刪除空,刪除高位,或者奇偶的改變而改
變.)
整數(shù)布局域
以源機(jī)器的字節(jié)序的 int32 常量 0x1020304.如果在這里偵測到錯誤的字節(jié)序,那么
讀者很可能在后面的字段列造成了字節(jié)錯位.
標(biāo)志域
int32 位掩碼表示該文件格式的重要方面.位是從 0(LSB)到 31 (MSB)編碼的 ---
請注意這個域是以源機(jī)器的位權(quán)重存儲的,后繼的整數(shù)都是如此.位 16 - 31 是保留
用做關(guān)鍵文件格式的;如果讀者發(fā)現(xiàn)一個不認(rèn)識的位出現(xiàn)在這個范圍內(nèi),那么它應(yīng)該退
出.位 0-15 都保留為標(biāo)志向后兼容的格式使用;讀者可以忽略這個范圍內(nèi)的不認(rèn)識的
位.目前只定義了一個標(biāo)志位,而其它的必須是零:
Bit 16
如果為 1,那么在傾倒中包括了 OID;如果為 0,則沒有
頭擴(kuò)展范圍長度
int32 以字節(jié)計的頭剩余長度,不包括自身.在初始的版本里,它將會是零,后面緊跟
第一條元組.對該格式的更多的修改都將允許額外的數(shù)據(jù)出現(xiàn)在頭中.讀者應(yīng)該忽略任
何它不知道該如何處理的頭擴(kuò)展數(shù)據(jù).
頭擴(kuò)展數(shù)據(jù)是一個用來保留一個自定義的數(shù)據(jù)訓(xùn)練用的.這個標(biāo)志域無意告訴讀者擴(kuò)展
區(qū)的內(nèi)容是什么.頭擴(kuò)展的具體設(shè)計內(nèi)容留給以后的版本用.
這樣設(shè)計就允許向下兼容頭附加(增加頭擴(kuò)展塊,或者設(shè)置低位序標(biāo)志位) 以及非向
下兼容修改(設(shè)置高位標(biāo)志位以標(biāo)識這樣的修改,并且根據(jù)需要向擴(kuò)展區(qū)域增加支持?jǐn)?shù)
據(jù)).
元組
每條元組都以一個 int16 計數(shù)開頭,該計數(shù)是元組中字段的數(shù)目.(目前,在一個表
里的每條元組都有相同的計數(shù),但可能不會永遠(yuǎn)這樣.)然后后面不斷出現(xiàn)元組中的各
個字段,在字段數(shù)據(jù)后面可能跟著一個 int16 類型長度字.類型長度域是這樣解釋
的:

數(shù)據(jù)域是 NULL.沒有數(shù)據(jù)跟著.
> 0
數(shù)據(jù)域是定長數(shù)據(jù)類型.和類型長字相同的準(zhǔn)確的 N 字節(jié).
-1
數(shù)據(jù)域是變長的數(shù)據(jù)類型.下面四個字節(jié)是變長頭, 它包含包括其自身在內(nèi)的所有值
長度.
< -1
保留為將來使用.
對于非 NULL 域,讀者可以檢查這個類型長度是否匹配目標(biāo)列的長度.這樣就提供了一
種簡單但有用的檢查,核實(shí)該數(shù)據(jù)是否預(yù)期數(shù)據(jù).
在數(shù)據(jù)域之間沒有對奇填充或者任何其它額外的數(shù)據(jù).還要注意該格式并不區(qū)分一種數(shù)
據(jù)類型是傳值還是傳參.這些東西都是非常有意的:它們可能可以提高這些文件的移植
性(盡管位權(quán)重和浮點(diǎn)格式等問題可能仍然不能讓你進(jìn)行跨機(jī)器移動二進(jìn)制數(shù)據(jù)).
如果在傾倒中包括了 OID,那么該 OID 域立即跟在域計數(shù)字后面.它是一個普通的
域,只不過它沒有包括在域計數(shù).但它包括類型長度 --- 這樣就允許我們不用花太多
的勁就可以處理 4 字節(jié)和 8 字節(jié),并且如果某個家伙允許 OID 是可選的話,那么還
可以把 OID 顯示成 NULL.
文件尾
文件尾包括一個 int16 字減 1.這樣就很容易與一條元組的域計數(shù)字 相區(qū)分.
如果一個域計數(shù)字既不是 -1 也不是預(yù)期的字段的數(shù)目,那么讀者應(yīng)該報錯.這樣就提
供了對丟失與數(shù)據(jù)的同步的額外的檢查.
用法
下面的例子把一個表拷貝到標(biāo)準(zhǔn)輸出, 使用豎直條(|)作為域分隔符:
COPY country TO stdout USING DELIMITERS '|'; 從一個 Unix 文件中拷貝數(shù)據(jù)到一
個表范圍中:
COPY country FROM '/usr1/proj/bray/sql/country_data'; 下面是一個可以從 stdin
中拷貝數(shù)據(jù) 到表中的例子(因此它在最后一行中有終止序列):
AF????? AFGHANISTANAL????? ALBANIADZ????? ALGERIAZM????? ZAMBIAZW
ZIMBABWE/. 請注意在這里每行里的空白實(shí)際上是一個 TAB.
下面的是同樣的數(shù)據(jù),在一臺 Linux/i586 機(jī)器上以二進(jìn)制形式輸出.這些數(shù)據(jù)是用
Unix 工具 od -c 過濾之后輸出的. 該表有三個域;第一個是 char(2),第二個是
text, 第三個是integer.所有的行在第三個域都是一個 null 值.
0000000?? P?? G?? B?? C?? O?? P?? Y /n 377 /r /n /0 004 003 002 0010000020
/0 /0 /0 /0 /0 /0 /0 /0 003 /0 377 377 006 /0 /0 /00000040?? A?? F 377 377
017 /0 /0 /0?? A?? F?? G?? H?? A?? N?? I?? S0000060?? T?? A?? N /0 /0 003 /0
377 377 006 /0 /0 /0?? A?? L 3770000100 377 /v /0 /0 /0?? A?? L?? B?? A?? N
I?? A /0 /0 003 /00000120 377 377 006 /0 /0 /0?? D?? Z 377 377 /v /0 /0 /0
A?? L0000140?? G?? E?? R?? I?? A /0 /0 003 /0 377 377 006 /0 /0 /0
Z0000160?? M 377 377 /n /0 /0 /0?? Z?? A?? M?? B?? I?? A /0 /0 0030000200 /0
377 377 006 /0 /0 /0?? Z?? W 377 377 /f /0 /0 /0?? Z0000220?? I?? M?? B?? A
B?? W?? E /0 /0 377 377 兼容性 SQL92?? 在 里沒有 COPY 語句.

----------------------------------------------------------------------------
----

CREATE AGGREGATE
CREATE AGGREGATE
Name
CREATE AGGREGATE? --? 定義一個新的聚集函數(shù)
Synopsis
CREATE AGGREGATE name ( BASETYPE = input_data_type,
SFUNC = sfunc, STYPE = state_type
[ , FINALFUNC = ffunc ]
[ , INITCOND = initial_condition ] )

輸入
name
要創(chuàng)建的聚集函數(shù)名.
input_data_type
本聚集函數(shù)要處理的基本數(shù)據(jù)類型. 對于不檢查輸入類型的聚集來說,這個參數(shù)可以
聲明為 ANY. (比如 count(*)).
sfunc
用于處理源數(shù)據(jù)列里的每一個輸入數(shù)據(jù)的狀態(tài)轉(zhuǎn)換函數(shù)名稱. 它通常是一個兩個參數(shù)
的函數(shù),第一個參數(shù)的類型是 state_type 而第二個參數(shù)的類型是 input_data_type.
另外,對于一個不檢查輸入數(shù)據(jù)的聚集,該函數(shù)只接受一個類型為 state_type 的參
數(shù). 不管是哪種情況,此函數(shù)必須返回一個類型為 state_type的值. 這個函數(shù)接受
當(dāng)前狀態(tài)值和當(dāng)前輸入數(shù)據(jù)條目,而返回下個狀態(tài)值.
state_type
聚集的狀態(tài)值的數(shù)據(jù)類型.
ffunc
在轉(zhuǎn)換完所有輸入域/字段后調(diào)用的最終處理函數(shù).它計算聚集的結(jié)果. 此函數(shù)必須接
受一個類型為 state_type 的參數(shù). 聚集的輸出數(shù)據(jù)類型被定義為此函數(shù)的返回類
型.如果沒有聲明 ffunc 則使用聚集結(jié)果的狀態(tài)值作為聚集的結(jié)果,而輸出類型為
state_type.
initial_condition
狀態(tài)值的初始設(shè)置(值).它必須是一個數(shù)據(jù)類型 state_type 可以接受的文本常量
值. 如果沒有聲明,狀態(tài)值初始為 NULL.
輸出
CREATE
命令執(zhí)行成功的返回信息.
描述
CREATE AGGREGATE允許用戶或程序員通過定義新的聚集函數(shù)來擴(kuò)展 PostgreSQL 的功
能.一些用于基本類型的聚集函數(shù)如 min(integer) 和 avg(double precision) 等已
經(jīng)包含在基礎(chǔ)軟件包里了. 如果你需要定義一個新類型或需要一個還沒有提供的聚集
函數(shù),這時便可用 CREATE AGGREGATE 來提供我們所需要的特性.
一個聚集函數(shù)是用它的名字和輸入數(shù)據(jù)類型來標(biāo)識的. 如果兩個聚集的輸入數(shù)據(jù)不
同,它們可以有相同的名字.要避免沖突, 不要寫一個與聚集同名而且輸入函數(shù)也相
同的普通函數(shù).
一個聚集函數(shù)是用一個或兩個普通函數(shù)做成的: 一個狀態(tài)轉(zhuǎn)換函數(shù) sfunc, 和一個可
選的終計算函數(shù) ffunc. 它們是這樣使用的:
sfunc( internal-state, next-data-item ) ---> next-internal-state
ffunc( internal-state ) ---> aggregate-value

PostgreSQL 創(chuàng)建一個類型為 stype的臨時變量. 它保存這個聚集的當(dāng)前內(nèi)部狀態(tài).
對于每個輸入數(shù)據(jù)條目, 都調(diào)用狀態(tài)轉(zhuǎn)換函數(shù)計算內(nèi)部狀態(tài)值的新數(shù)值.在處理完所
有數(shù)據(jù)后,調(diào)用一次最終處理函數(shù)以計算聚集的輸出值. 如果沒有最終處理函數(shù),那
么將最后的狀態(tài)值當(dāng)做返回值.
一個聚集函數(shù)還可能提供一個初始條件,也就是說, 所用的該內(nèi)部狀態(tài)值的初始
值.這個值是作為類型 text 的數(shù)據(jù)域存儲在數(shù)據(jù)庫里的, 不過它們必須是狀態(tài)值數(shù)
據(jù)類型的合法的外部表現(xiàn)形式的常量. 如果沒有提供狀態(tài),那么狀態(tài)值初始化為
NULL.
如果在 pg_proc 里該狀態(tài)轉(zhuǎn)換函數(shù)被定義為 "strict", 那么 NULL 輸入就不能調(diào)用
它.這個時候,帶有這樣的轉(zhuǎn)換函數(shù)的聚集執(zhí)行起來的現(xiàn)象如下所述.NULL 輸入的值
被忽略(不調(diào)用此函數(shù)并且保留前一個 狀態(tài)值).如果初始狀態(tài)值是 NULL,那么由第
一個非 NULL 值替換該狀態(tài)值, 而狀態(tài)轉(zhuǎn)換函數(shù)從第二個非 NULL 的輸入值開始調(diào)
用.這樣做讓我們比較容易 實(shí)現(xiàn)象 max 這樣的聚集.請注意這種行為只是當(dāng)
state_type 與 input_data_type 相同的時候才表現(xiàn)出來. 如果這些類型不同,你必
須提供一個非 NULL 的初始條件或者使用一個 非strice的狀態(tài)轉(zhuǎn)換函數(shù).
如果狀態(tài)轉(zhuǎn)換函數(shù)不是 strict(嚴(yán)格)的, 那么它將無條件地為每個輸入值調(diào)用,并
且必須自行處理 NULL 輸入和 NULL 轉(zhuǎn)換值, 這樣就允許聚集的作者對聚集中的 NULL
有完全的控制.
如果終轉(zhuǎn)換函數(shù)定義為"strict",則如果最終狀態(tài)值是 NULL 時就不能調(diào)用它; 而是
自動輸出一個NULL的結(jié)果.(當(dāng)然,這才是 strict 函數(shù)的正常特征.) 不管是那種
情況,終處理函數(shù)可以選擇返回 NULL.比如, avg 的終處理函數(shù)在零輸入記錄時就會
返回 NULL.
注意
使用 DROP AGGREGATE 刪除聚集函數(shù).
CREATE AGGREGATE的參數(shù)可以以任何順序書寫,而不只是上面顯示的順序.
用法
請參考 PostgreSQL 程序員手冊 聚集函數(shù)章節(jié)的聚集函數(shù)部分獲取完整的例子.
兼容性 SQL92
CREATE AGGREGATE是 PostgreSQL 語言的擴(kuò)展. 在 里沒有 CREATE AGGREGATE.

----------------------------------------------------------------------------
----

CREATE CONSTRAINT TRIGGER
CREATE CONSTRAINT TRIGGER
Name
CREATE CONSTRAINT TRIGGER? --? 定義一個新的約束觸發(fā)器
Synopsis
CREATE CONSTRAINT TRIGGER name
AFTER events ON
relation constraint attributes
FOR EACH ROW EXECUTE PROCEDURE func '(' args ')'

輸入
name
約束觸發(fā)器的名稱.
events
觸發(fā)該觸發(fā)器的事件范圍.
relation
被觸發(fā)的關(guān)系名稱.
constraint
實(shí)際的約束聲明.
attributes
約束屬性.
func(args)
觸發(fā)器處理所調(diào)用的函數(shù).
輸出
CREATE CONSTRAINT
成功創(chuàng)建后的返回信息.
描述
CREATE CONSTRAINT TRIGGER被 CREATE/ALTER TABLE 內(nèi)部使用以及被 pg_dump 用于創(chuàng)
建那些用于參考完整性的特殊的觸發(fā)器.
這條語句不是做一般用途用的.

----------------------------------------------------------------------------
----

CREATE DATABASE
CREATE DATABASE
Name
CREATE DATABASE? --? 創(chuàng)建新數(shù)據(jù)庫
Synopsis
CREATE DATABASE name
[ WITH [ LOCATION = 'dbpath' ]
[ TEMPLATE = template ]
[ ENCODING = encoding ] ]

輸入
name
要創(chuàng)建的數(shù)據(jù)庫名.
dbpath
在文件系統(tǒng)里存儲新數(shù)據(jù)庫的可選位置;用字串文本聲明. 或者用 DEFAULT 表示使用
缺省位置.
template
從哪個模板創(chuàng)建新數(shù)據(jù)庫,這是模板名.或者用 DEFAULT 使用缺省模板
(template1).
encoding
創(chuàng)建新數(shù)據(jù)庫用的多字節(jié)編碼方法.聲明一個字串文本名字 (比如,'SQL_ASCII'),
或者一個整數(shù)編號,或者是 DEFAULT 表示使用缺省編碼.
輸出
CREATE DATABASE
命令成功執(zhí)行的返回信息.
ERROR: user 'username' is not allowed to create/drop databases
你必須有特殊的 CREATEDB 權(quán)限來創(chuàng)建數(shù)據(jù)庫。參閱 See CREATE USER。
ERROR: createdb: database "name" already exists
如果聲明的數(shù)據(jù)庫 name 已經(jīng)存在返回的信息.
ERROR: database path may not contain single quotes
數(shù)據(jù)庫路徑名 dbpath 不能包含單引號。這樣要求是為了創(chuàng)建數(shù)據(jù)庫目錄的 shell 命
令能夠正確執(zhí)行。
ERROR: CREATE DATABASE: may not be called in a transaction block
如果你有一個明確的事務(wù)塊正在處理,你不能調(diào)用 CREATE DATABASE。你必須先結(jié)束事
務(wù)。
ERROR: Unable to create database directory 'path'.
ERROR: Could not initialize database directory.
這種情況最有可能是因?yàn)閷?shù)據(jù)目錄權(quán)限不夠, 磁盤已滿或其他文件系統(tǒng)問題。數(shù)據(jù)
庫服務(wù)器運(yùn)行的機(jī)器上的用戶必 須能訪問該路徑。
描述
CREATE DATABASE創(chuàng)建一個新的 PostgreSQL 數(shù)據(jù)庫.創(chuàng)建者成為新數(shù)據(jù)庫的管理員.
可以聲明一個可選的數(shù)據(jù)庫位置,例如,在另一塊硬盤上存放數(shù)據(jù)庫。 該路徑必須是
事先用 initlocation命令準(zhǔn)備好了的.
如果路徑名不包含斜杠,那么它被解釋成一個環(huán)境變量, 該變量必須為服務(wù)進(jìn)程所
知。這樣數(shù)據(jù)庫管理員 可以對能夠在那里創(chuàng)建數(shù)據(jù)庫進(jìn)行控制。(例如,一個用戶化
的選擇是 'PGDATA2'。)如果服務(wù)器帶著 ALLOW_ABSOLUTE_DBPATHS (缺省時沒有)選
項(xiàng)編譯,那么也允許使用以斜杠開頭為標(biāo)識的絕對路徑(例如, '
'/usr/local/pgsql/data')。
缺省時,新數(shù)據(jù)庫將通過克隆標(biāo)準(zhǔn)系統(tǒng)數(shù)據(jù)庫 template1 來創(chuàng)建.不同的模板可以用
TEMPLATE = name 來寫.尤其是,如果你用 TEMPLATE = template0, 你可以創(chuàng)建一個
很純凈的數(shù)據(jù)庫,只包括你的版本的 PostgreSQL 預(yù)定義的標(biāo)準(zhǔn)對象.這個方法可以避
免把任何已經(jīng)加入到template1 里的本地安裝對象拷貝到新數(shù)據(jù)庫.
可選的編碼參數(shù)允許選擇數(shù)據(jù)庫編碼, 如果你的服務(wù)器是帶著多字節(jié)編碼支持編譯的
話. 如果沒有聲明,缺省是所選用的模板數(shù)據(jù)庫用的編碼.
可選參數(shù)可以以任意順序?qū)?,而不僅是上面顯示的順序.
注意
CREATE DATABASE是 PostgreSQL 語言的擴(kuò)展.
使用 DROP DATABASE刪除一個數(shù)據(jù)庫.
程序 createdb是 是這個命令的 shell 腳本的封裝,提供來方便使用。
在用絕對路徑指定的可選數(shù)據(jù)庫位置時, 有一些安全和數(shù)據(jù)完整性的問題, 而且缺省
時只有后端識別的環(huán)境變量可以聲明為可選的路徑.參考管理員手冊獲取更多的信息.

盡管我們可以通過把某數(shù)據(jù)庫名聲明為模板從非template1數(shù)據(jù)庫拷貝數(shù)據(jù)庫,但是這
(還)不是一個通用的 COPY DATABASE 功能. 因此,我們建議當(dāng)做模板使用的數(shù)據(jù)庫
都應(yīng)該是以只讀方式對待的.參閱管理員手冊獲取更多信息.
用法
創(chuàng)建一個新的數(shù)據(jù)庫:
olly=> create database lusiadas;

在另一個地方 ~/private_db創(chuàng)建新數(shù)據(jù)庫:
$ mkdir private_db
$ initlocation ~/private_db
The location will be initialized with username "olly".
This user will own all the files and must also own the server process.
Creating directory /home/olly/private_db
Creating directory /home/olly/private_db/base

initlocation is complete.
$ psql olly
Welcome to psql, 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
olly=> CREATE DATABASE elsewhere WITH LOCATION = '/home/olly/private_db';
CREATE DATABASE
兼容性 SQL92
在 里沒有 CREATE DATABASE 語句. 數(shù)據(jù)庫等同于目錄,其創(chuàng)建是由實(shí)現(xiàn)決定的.

----------------------------------------------------------------------------
----

CREATE FUNCTION
CREATE FUNCTION
Name
CREATE FUNCTION? --? 定義一個新函數(shù)
Synopsis
CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )
RETURNS rettype
AS 'definition'
LANGUAGE 'langname'
[ WITH ( attribute [, ...] ) ]
CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )
RETURNS rettype
AS 'obj_file' , 'link_symbol'
LANGUAGE langname
[ WITH ( attribute [, ...] ) ]

描述
CREATE FUNCTION定義一個新的函數(shù). CREATE OR REPLACE FUNCTION 將要么創(chuàng)建一個
新函數(shù),要么替換現(xiàn)有的定義.
參數(shù)
name
要創(chuàng)建的函數(shù)名字.這個名字可以不是唯一的, 因?yàn)楹瘮?shù)可以重載,膽識同名的函數(shù)
必須有不同的參數(shù)類型.
argtype
該函數(shù)的數(shù)據(jù)類型(如果有).輸入類型可以是基本類型,也可以是復(fù)合類型,opaque,
或者和一個現(xiàn)有字段相同的類型. Opaque 表示該函數(shù)接受非 SQL 類型,比如 char
*. 一個字段的類型是用 tablename.columnname%TYPE 表示的;使用這個東西可以幫
助函數(shù)獨(dú)立于表定義的修改.
rettype
返回數(shù)據(jù)類型.輸出類型可以聲明為一個基本類型,復(fù)合類型, setof 類型,
opaque, 或者和現(xiàn)有字段同類型. setof 修飾詞表示該函數(shù)將返回一套條目,而不是
一條條目.返回類型聲明為 opaque 的函數(shù)不返回數(shù)值.它們不能直接調(diào)用;觸發(fā)器函
數(shù)可以利用這個 特性.
definition
一個定義函數(shù)的字串;含義取決于語言.它可以是一個內(nèi)部函數(shù)名字, 一個指向某個
目標(biāo)文件的路徑,一個 SQL 查詢,或者一個用過程語言 寫的文本.
obj_file, link_symbol
這個形式的 AS 子句用于在函數(shù)的 C 源文件 名字和 SQL 函數(shù)的名字不同的時候動態(tài)
聯(lián)接 C 語言函數(shù). 字串 obj_file 是包含可動態(tài)裝載的對象的文件名,而
link_symbol 是對象的聯(lián)接符號,也就是該函數(shù)在 C 源文件列的名字.
langname
可以是 SQL,C, internal,或者 plname,這里的 plname 是一種已創(chuàng)建過程語言的
名字. 參閱 CREATE LANGUAGE獲取細(xì)節(jié). 為了保持向下兼容,該名字可以用單引號包
圍.
attribute
一段可選的有關(guān)該函數(shù)的信息,用于優(yōu)化.見下文獲取細(xì)節(jié).
創(chuàng)建該函數(shù)的用戶成為該函數(shù)所有者.
下面的屬性可以出現(xiàn)在 WITH 子句里∶
iscachable
Iscachable 表示此函數(shù)在輸入相同時總是返回相同的值 (也就是說, 它不做數(shù)據(jù)庫
查找或者是使用沒有直接在它的參數(shù)列表出現(xiàn)的信息)。 優(yōu)化器使用 iscachable 來
認(rèn)知對該函數(shù)的調(diào)用進(jìn)行預(yù)先計算是否安全。
isstrict
isstrict 表明如果它的任何參數(shù)是 NULL,此函數(shù)總是返回 NULL. 如果聲明了這個屬
性,則如果存在 NULL 參數(shù)時不會執(zhí)行該函數(shù); 而只是自動假設(shè)一個 NULL 結(jié)果.如
果沒有聲明 isstrict 該函數(shù)將為 NULL 輸入調(diào)用并進(jìn)行處理. 那么剩下的事就是函
數(shù)作者的責(zé)任來檢查 NULL 是否必須并且做相應(yīng)響應(yīng).
注意
請參閱 PostgreSQL 程序員手冊 關(guān)于通過函數(shù)擴(kuò)展 PostgreSQL 的章節(jié)獲取更多關(guān)于
書寫外部函數(shù)的信息.
我們允許你將完整的 SQL 類型語法用于 輸入?yún)?shù)和返回值.不過,有些類型聲明的細(xì)
節(jié)(比如, numeric 類型的精度域)是由下層函數(shù)實(shí)現(xiàn)負(fù)責(zé)的, 并且會被 CREATE
FUNCTION 命令悄悄地吞掉. (也就是說,不再被識別或強(qiáng)制).
PostgreSQL 允許函數(shù) 重載;也就是說,同一個函數(shù)名可以用于幾個不同的函數(shù), 只
要它們的參數(shù)可以區(qū)分它們。不過,這個功能在用于 internal(內(nèi)部)和 C 語言 的函
數(shù)時要小心。
兩個 internal 函數(shù)擁有相同 C 名稱時肯定會發(fā)生鏈接時錯誤。 要解決這個問題,給
它們賦予不同的 C 名稱(例如,使用參數(shù)類型做為 C 名稱的一部分),然后在
CREATE FUNCTION 的 AS 子句里面聲明這些名字。 如果 AS 子句為空,那么 CREATE
FUNCTION 假設(shè)函數(shù)的 C 名稱與SQL名稱一樣。
類似的還有,如果用多個 C 語言函數(shù)重載 SQL 函數(shù), 給每個 C 語言函數(shù)的實(shí)例一個
獨(dú)立的名稱,然后使用 CREATE FUNCTION 語法里的 AS 句的不同形式來選擇每個重載
的 SQL 函數(shù)的正確的 C 語言實(shí)現(xiàn).
如果重復(fù)調(diào)用 CREATE FUNCTION,并且都指向同一個目標(biāo)文件,那么該文件只裝載一
次.要卸載和恢復(fù)裝載 該文件(可能是在開發(fā)過程中),你可以使用 LOAD命令.
使用 DROP FUNCTION 刪除一個用戶定義函數(shù).
要更新現(xiàn)存函數(shù)的定義,用 CREATE OR REPLACE FUNCTION.請注意不可能用這種方法
改變一個函數(shù)的名字或者參數(shù)類型 (如果你這么干,你只是會創(chuàng)建一個新的,不同的函
數(shù)). 同樣,CREATE OR REPLACE FUNCTION 也不會 讓你改變一個現(xiàn)存函數(shù)的返回類
型.要干這些事,你必須刪除并 重新創(chuàng)建該函數(shù).
如果你刪除然后重新創(chuàng)建一個函數(shù),新函數(shù)和舊的并非相同實(shí)體; 你會破壞現(xiàn)存的引
用了原有函數(shù)的規(guī)則,視圖,觸發(fā)器等等.使用 CREATE OR REPLACE FUNCTION 可以改
變一個函數(shù)的定義而又不會破壞引用該函數(shù)的對象.
例子
要創(chuàng)建一個簡單的 SQL 函數(shù)∶
CREATE FUNCTION one() RETURNS integer
AS 'SELECT 1 AS RESULT;'
LANGUAGE SQL;
SELECT one() AS answer;
answer
--------
1
這個例子通過調(diào)用一個用戶創(chuàng)建的名為 funcs.so (擴(kuò)展名因平臺而異)的共享庫過程創(chuàng)
建一個 C 函數(shù). 該共享庫文件應(yīng)該位于服務(wù)器的動態(tài)搜索路徑里.該路徑計算一個檢
測位并且如果函數(shù)參數(shù)里的檢測位 正確就返回一個 TRUE .這些可以通過用一個
CHECK 約束實(shí)現(xiàn)的.
CREATE FUNCTION ean_checkdigit(char, char) RETURNS boolean
AS 'funcs' LANGUAGE C;
CREATE TABLE product (
id??????? char(8) PRIMARY KEY,
eanprefix char(8) CHECK (eanprefix ~ '[0-9]{2}-[0-9]{5}')
REFERENCES brandname(ean_prefix),
eancode?? char(6) CHECK (eancode ~ '[0-9]{6}'),
CONSTRAINT ean??? CHECK (ean_checkdigit(eanprefix, eancode))
);
這個例子創(chuàng)建一個在用戶定義類型 complex 和內(nèi)部類型 point 之間做類型轉(zhuǎn)換的函
數(shù)。該函數(shù)是用一個從 C 源代碼編譯的 動態(tài)裝載的對象來實(shí)現(xiàn)的。(我們演示了使用
聲明共享目標(biāo)文件 的準(zhǔn)確路徑名的過時方法). 對于 PostgreSQL 而言, 要自動尋找
類型轉(zhuǎn)換函數(shù),SQL 函數(shù)必須和返回類型同名,因而重載是不可避免的。 該函數(shù)名通
過使用 SQL定義里 AS 子句的第二種類型來重載:
CREATE FUNCTION point(complex) RETURNS point
AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
LANGUAGE C;
該函數(shù)的 C 聲明可以是∶
Point * complex_to_point (Complex *z)
{
Point *p;
p = (Point *) palloc(sizeof(Point));
p->x = z->x;
p->y = z->y;
return p;
}
兼容性 SQL92
在 SQL99 里的確定義了一個CREATE FUNCTION PostgreSQL 的和它類似但是不兼容.這
個屬性是不可移植的,可以使用的不同語言也是如此.
又見
DROP FUNCTION , LOAD, PostgreSQL程序員手冊

----------------------------------------------------------------------------
----

CREATE FUNCTION
Name
CREATE FUNCTION? --? 定義一個新函數(shù)
Synopsis
CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )
RETURNS rettype
AS 'definition'
LANGUAGE 'langname'
[ WITH ( attribute [, ...] ) ]
CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )
RETURNS rettype
AS 'obj_file' , 'link_symbol'
LANGUAGE langname
[ WITH ( attribute [, ...] ) ]
描述
CREATE FUNCTION定義一個新的函數(shù). CREATE OR REPLACE FUNCTION 將要么創(chuàng)建一個
新函數(shù),要么替換現(xiàn)有的定義.
參數(shù)
name
要創(chuàng)建的函數(shù)名字.這個名字可以不是唯一的, 因?yàn)楹瘮?shù)可以重載,膽識同名的函數(shù)
必須有不同的參數(shù)類型.
argtype
該函數(shù)的數(shù)據(jù)類型(如果有).輸入類型可以是基本類型,也可以是復(fù)合類型,opaque,
或者和一個現(xiàn)有字段相同的類型. Opaque 表示該函數(shù)接受非 SQL 類型,比如 char
*. 一個字段的類型是用 tablename.columnname%TYPE 表示的;使用這個東西可以幫
助函數(shù)獨(dú)立于表定義的修改.
rettype
返回數(shù)據(jù)類型.輸出類型可以聲明為一個基本類型,復(fù)合類型, setof 類型,
opaque, 或者和現(xiàn)有字段同類型. setof 修飾詞表示該函數(shù)將返回一套條目,而不是
一條條目.返回類型聲明為 opaque 的函數(shù)不返回數(shù)值.它們不能直接調(diào)用;觸發(fā)器函
數(shù)可以利用這個 特性.
definition
一個定義函數(shù)的字串;含義取決于語言.它可以是一個內(nèi)部函數(shù)名字, 一個指向某個
目標(biāo)文件的路徑,一個 SQL 查詢,或者一個用過程語言 寫的文本.
obj_file, link_symbol
這個形式的 AS 子句用于在函數(shù)的 C 源文件 名字和 SQL 函數(shù)的名字不同的時候動態(tài)
聯(lián)接 C 語言函數(shù). 字串 obj_file 是包含可動態(tài)裝載的對象的文件名,而
link_symbol 是對象的聯(lián)接符號,也就是該函數(shù)在 C 源文件列的名字.
langname
可以是 SQL,C, internal,或者 plname,這里的 plname 是一種已創(chuàng)建過程語言的
名字. 參閱 CREATE LANGUAGE獲取細(xì)節(jié). 為了保持向下兼容,該名字可以用單引號包
圍.
attribute
一段可選的有關(guān)該函數(shù)的信息,用于優(yōu)化.見下文獲取細(xì)節(jié).
創(chuàng)建該函數(shù)的用戶成為該函數(shù)所有者.
下面的屬性可以出現(xiàn)在 WITH 子句里∶
iscachable
Iscachable 表示此函數(shù)在輸入相同時總是返回相同的值 (也就是說, 它不做數(shù)據(jù)庫
查找或者是使用沒有直接在它的參數(shù)列表出現(xiàn)的信息)。 優(yōu)化器使用 iscachable 來
認(rèn)知對該函數(shù)的調(diào)用進(jìn)行預(yù)先計算是否安全。
isstrict
isstrict 表明如果它的任何參數(shù)是 NULL,此函數(shù)總是返回 NULL. 如果聲明了這個屬
性,則如果存在 NULL 參數(shù)時不會執(zhí)行該函數(shù); 而只是自動假設(shè)一個 NULL 結(jié)果.如
果沒有聲明 isstrict 該函數(shù)將為 NULL 輸入調(diào)用并進(jìn)行處理. 那么剩下的事就是函
數(shù)作者的責(zé)任來檢查 NULL 是否必須并且做相應(yīng)響應(yīng).
注意
請參閱 PostgreSQL 程序員手冊 關(guān)于通過函數(shù)擴(kuò)展 PostgreSQL 的章節(jié)獲取更多關(guān)于
書寫外部函數(shù)的信息.
我們允許你將完整的 SQL 類型語法用于 輸入?yún)?shù)和返回值.不過,有些類型聲明的細(xì)
節(jié)(比如, numeric 類型的精度域)是由下層函數(shù)實(shí)現(xiàn)負(fù)責(zé)的, 并且會被 CREATE
FUNCTION 命令悄悄地吞掉. (也就是說,不再被識別或強(qiáng)制).
PostgreSQL 允許函數(shù) 重載;也就是說,同一個函數(shù)名可以用于幾個不同的函數(shù), 只
要它們的參數(shù)可以區(qū)分它們。不過,這個功能在用于 internal(內(nèi)部)和 C 語言 的函
數(shù)時要小心。
兩個 internal 函數(shù)擁有相同 C 名稱時肯定會發(fā)生鏈接時錯誤。 要解決這個問題,給
它們賦予不同的 C 名稱(例如,使用參數(shù)類型做為 C 名稱的一部分),然后在
CREATE FUNCTION 的 AS 子句里面聲明這些名字。 如果 AS 子句為空,那么 CREATE
FUNCTION 假設(shè)函數(shù)的 C 名稱與SQL名稱一樣。
類似的還有,如果用多個 C 語言函數(shù)重載 SQL 函數(shù), 給每個 C 語言函數(shù)的實(shí)例一個
獨(dú)立的名稱,然后使用 CREATE FUNCTION 語法里的 AS 句的不同形式來選擇每個重載
的 SQL 函數(shù)的正確的 C 語言實(shí)現(xiàn).
如果重復(fù)調(diào)用 CREATE FUNCTION,并且都指向同一個目標(biāo)文件,那么該文件只裝載一
次.要卸載和恢復(fù)裝載 該文件(可能是在開發(fā)過程中),你可以使用 LOAD命令.
使用 DROP FUNCTION 刪除一個用戶定義函數(shù).
要更新現(xiàn)存函數(shù)的定義,用 CREATE OR REPLACE FUNCTION.請注意不可能用這種方法
改變一個函數(shù)的名字或者參數(shù)類型 (如果你這么干,你只是會創(chuàng)建一個新的,不同的函
數(shù)). 同樣,CREATE OR REPLACE FUNCTION 也不會 讓你改變一個現(xiàn)存函數(shù)的返回類
型.要干這些事,你必須刪除并 重新創(chuàng)建該函數(shù).
如果你刪除然后重新創(chuàng)建一個函數(shù),新函數(shù)和舊的并非相同實(shí)體; 你會破壞現(xiàn)存的引
用了原有函數(shù)的規(guī)則,視圖,觸發(fā)器等等.使用 CREATE OR REPLACE FUNCTION 可以改
變一個函數(shù)的定義而又不會破壞引用該函數(shù)的對象.
例子
要創(chuàng)建一個簡單的 SQL 函數(shù)∶
CREATE FUNCTION one() RETURNS integer
AS 'SELECT 1 AS RESULT;'
LANGUAGE SQL;
SELECT one() AS answer;
answer
--------
1
這個例子通過調(diào)用一個用戶創(chuàng)建的名為 funcs.so (擴(kuò)展名因平臺而異)的共享庫過程創(chuàng)
建一個 C 函數(shù). 該共享庫文件應(yīng)該位于服務(wù)器的動態(tài)搜索路徑里.該路徑計算一個檢
測位并且如果函數(shù)參數(shù)里的檢測位 正確就返回一個 TRUE .這些可以通過用一個
CHECK 約束實(shí)現(xiàn)的.
CREATE FUNCTION ean_checkdigit(char, char) RETURNS boolean
AS 'funcs' LANGUAGE C;
CREATE TABLE product (
id??????? char(8) PRIMARY KEY,
eanprefix char(8) CHECK (eanprefix ~ '[0-9]{2}-[0-9]{5}')
REFERENCES brandname(ean_prefix),
eancode?? char(6) CHECK (eancode ~ '[0-9]{6}'),
CONSTRAINT ean??? CHECK (ean_checkdigit(eanprefix, eancode))
);
這個例子創(chuàng)建一個在用戶定義類型 complex 和內(nèi)部類型 point 之間做類型轉(zhuǎn)換的函
數(shù)。該函數(shù)是用一個從 C 源代碼編譯的 動態(tài)裝載的對象來實(shí)現(xiàn)的。(我們演示了使用
聲明共享目標(biāo)文件 的準(zhǔn)確路徑名的過時方法). 對于 PostgreSQL 而言, 要自動尋找
類型轉(zhuǎn)換函數(shù),SQL 函數(shù)必須和返回類型同名,因而重載是不可避免的。 該函數(shù)名通
過使用 SQL定義里 AS 子句的第二種類型來重載:
CREATE FUNCTION point(complex) RETURNS point
AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
LANGUAGE C;
該函數(shù)的 C 聲明可以是∶
Point * complex_to_point (Complex *z)
{
Point *p;
p = (Point *) palloc(sizeof(Point));
p->x = z->x;
p->y = z->y;
return p;
}
兼容性 SQL92
在 SQL99 里的確定義了一個CREATE FUNCTION PostgreSQL 的和它類似但是不兼容.這
個屬性是不可移植的,可以使用的不同語言也是如此.
又見
DROP FUNCTION , LOAD, PostgreSQL程序員手冊

----------------------------------------------------------------------------
----

CREATE GROUP
CREATE GROUP
Name
CREATE GROUP? --? 定義一個新的用戶組
Synopsis
CREATE GROUP name [ [ WITH ] option [ ... ] ]

這里 option 可以是∶

SYSID gid
| USER username [, ...]

輸入
name
組名。
gid
SYSID 子句可以用于選擇 PostgreSQL 里新組的組標(biāo)識(group id)。 不過,這樣做
不是必須的。
如果沒有聲明這個,將使用從 1 開始的,已分配的最高組標(biāo)識加一作為缺省值。
username
包括到組里面的用戶列表。用戶必須已經(jīng)存在。
輸出
CREATE GROUP
成功創(chuàng)建組后的返回。
描述
CREATE GROUP 將在數(shù)據(jù)庫節(jié)點(diǎn)上創(chuàng)建一個新組。參考管理員手冊獲取關(guān)于使用組來認(rèn)
證的信息。 要使用這條命令, 你必須是數(shù)據(jù)庫超級用戶。
使用 ALTER GROUP修改組成員,DROP GROUP刪除一個組。
用法
創(chuàng)建一個空組:
CREATE GROUP staff
創(chuàng)建一個有成員的組:
CREATE GROUP marketing WITH USER jonathan, david
兼容性 SQL92

里沒有 CREATE GROUP 。Roles 在概念上與組類似。

----------------------------------------------------------------------------
----

CREATE LANGUAGE
CREATE LANGUAGE
Name
CREATE LANGUAGE -- 定義一種新的過程語言
Synopsis
CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE langname
HANDLER call_handler
描述
使用 CREATE LANGUAGE, 一個PostgreSQL 用戶可以在 PostgreSQL里注冊一個新的語
言.因而,函數(shù)和觸發(fā)器過程可以用這種新語言定義.要注冊新 語言用戶必須具有
PostgreSQL 超級用戶權(quán)限.
CREATE LANGUAGE將該語言的名字和一個調(diào)用句柄 關(guān)聯(lián)起來,而該調(diào)用句柄負(fù)責(zé)執(zhí)行該
語言書寫的函數(shù).請參考程序員手冊獲取有關(guān)語言調(diào)用句柄的 更多信息.
請注意過程語言是對每個獨(dú)立的數(shù)據(jù)庫而言是自己的. 要讓一種語言缺省時可以為所
有數(shù)據(jù)庫獲得,那你應(yīng)該把它安裝到 template1 數(shù)據(jù)庫里.
參數(shù)
TRUSTED
TRUSTED 說明對該語言的調(diào)用句柄是安全的;也就是說,它不會提供給非特權(quán)用戶任何
繞過訪問限制的能力. 如果忽略這個關(guān)鍵字,只有具有 PostgreSQL 超級用戶權(quán)限的
人可以使用這個語言創(chuàng)建新的函數(shù).
PROCEDURAL
這是個沒有用的字.
langname
新的過程化語言的名稱.語言名是大小寫無關(guān)的. 一個過程化語言不能覆蓋
PostgreSQL內(nèi)置的語言.
出于向下兼容的原因,這個名字可以用單引號包圍.
HANDLER call_handler
call_handler是一個以前注冊過的函數(shù)的名字,該函數(shù)將被調(diào)用來執(zhí)行這門過程語言寫
的函數(shù).過程語言的調(diào)用句柄必須用一種編譯語言書寫,比如 C,調(diào)用風(fēng)格必須 是版
本 1 的調(diào)用風(fēng)格,并且在 PostgreSQL 里注冊為不接受參數(shù)并且返回 opaque 類型的
函數(shù), (opaque 是用于未聲明或未定義類型的占位符). undefined types.
診斷
CREATE
如果語言成功創(chuàng)建,返回此信息.
ERROR: PL handler function funcname() doesn't exist
如果沒有找到函數(shù) funcname(), 則返回此信息.
注意
這條命令通常不應(yīng)該由用戶直接執(zhí)行. 對于 PostgreSQL 版本里提供的過程語言,我
們應(yīng)該使用 createlang腳本, 它將為我們安裝正確的調(diào)用句柄. (createlang 也會
在內(nèi)部調(diào)用 CREATE LANGUAGE.)
使用 CREATE FUNCTION 命令創(chuàng)建新函數(shù).
使用 DROP LANGUAGE,或者更好是 droplang腳本刪除一個過程語言.
系統(tǒng)表 pg_language 記錄了更多有關(guān) 當(dāng)前安裝的過程語言的信息.
Table "pg_language"
Attribute?? | Type?? | Modifier
---------------+---------+----------
lanname?????? | name??? |
lanispl?????? | boolean |
lanpltrusted | boolean |
lanplcallfoid | oid???? |
lancompiler?? | text??? |

lanname?? | lanispl | lanpltrusted | lanplcallfoid | lancompiler
-------------+---------+--------------+---------------+-------------
internal??? | f?????? | f??????????? |???????????? 0 | n/a
C?????????? | f?????? | f??????????? |???????????? 0 | /bin/cc
sql???????? | f?????? | f??????????? |???????????? 0 | postgres
目前,一種過程語言創(chuàng)建之后它的定義就不能再更改.
例子
下面兩條順序執(zhí)行的命令將注冊一門新的過程語言及其關(guān)聯(lián)的調(diào)用句柄.
CREATE FUNCTION plsample_call_handler () RETURNS opaque
AS '$libdir/plsample'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;
兼容性 SQL92
CREATE LANGUAGE是 PostgreSQL 擴(kuò)展.
歷史
CREATE LANGUAGE命令第一次出現(xiàn)在 PostgreSQL 6.3.
又見
createlang, CREATE FUNCTION , droplang, DROP LANGUAGE, PostgreSQL 程序員手冊

----------------------------------------------------------------------------
----

CREATE OPERATOR
CREATE OPERATOR
Name
CREATE OPERATOR? --? 定義一個新的操作符
Synopsis
CREATE OPERATOR name ( PROCEDURE = func_name
[, LEFTARG = lefttype
] [, RIGHTARG = righttype ]
[, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
[, RESTRICT = res_proc ] [, JOIN = join_proc ]
[, HASHES ] [, SORT1 = left_sort_op ] [, SORT2 = right_sort_op ] )

輸入
name
要定義的操作符。可用的字符見下文。
func_name
用于實(shí)現(xiàn)該操作符的函數(shù)。
lefttype
如果存在的話,操作符左手邊的參數(shù)類型. 如果是左目操作符,這個參數(shù)可以省略。
righttype
如果存在的話,操作符右手邊的參數(shù)類型. 如果是右目操作符,這個參數(shù)可以省略。
com_op
該操作符對應(yīng)的交換(commutator)操作符。
neg_op
對應(yīng)的負(fù)操作符。
res_proc
此操作符約束選擇性計算函數(shù)。
join_proc
此操作符連接選擇性計算函數(shù)。
HASHES
表明此操作符支持哈希(散列)連接。
left_sort_op
如果此操作符支持融合連接(join),此操作符的左手邊數(shù)據(jù)的排序操作符。
right_sort_op
如果此操作符支持融合連接(join),此操作符的右手邊數(shù)據(jù)的排序操作符。
輸出
CREATE
成功創(chuàng)建操作符后的返回信息.
描述
CREATE OPERATOR定義一個新的操作符, name. 定義該操作符的用戶成為其所有者.
操作符 name 是一個最多NAMEDATALEN-1 長的(缺省為 31 個)下列字符組成的字串:

+ - * / < > = ~ ! @ # % ^ & | ` ? $
你選擇名字的時候有幾個限制:
"$" 和 ":" 不能定義為單字符操作符, 但是它們可以是一個多字符操作符的名稱的一
部分.
"--" 和 "/*" 不能在操作符名字的任何地方出現(xiàn), 因?yàn)樗鼈儠徽J(rèn)為是一個注釋的開
始.
一個多字符的操作符名字不能以 "+" 或 "-" 結(jié)尾, 除非該名字還包含至少下面字符
之一:
~ ! @ # % ^ & | ` ? $
例如, @- 是一個允許的操作符名, 但 *- 不是. 這個限制允許 PostgreSQL 分析
SQL-有問題的查詢而不要求在符號之間有空白.
注意: 當(dāng)使用非 SQL-標(biāo)準(zhǔn)操作符名時, 你通常將需要用空白把聯(lián)接的操作符分離開以
避免含混.例如,如果你定義了一個左目操作符,名為 "@",你不能寫 X*@Y;你必須
寫成 X* @Y 以保證 PostgreSQL 把它讀做兩個操作符而不是一個.
操作符 "!=" 在輸入時映射成 "<>", 因此這兩個名稱總是相等的.
至少需要定義一個 LEFTARG 或 RIGHTARG. 對于雙目操作符來說,兩者都需要定義.
對右目操作符來說,只需要定義 LEFTARG, 而對于左目操作符來說,只需要定義
RIGHTARG.
同樣, func_name 過程必須已經(jīng)用 CREATE FUNCTION 定義過, 而且必須定義為接受
正確數(shù)量的指定類型參數(shù)(一個或是兩個).
如果存在換向操作符則必須指明,這樣 PostgreSQL 可以按它的意愿轉(zhuǎn)換操作符的方
向.例如,操作符面積小于, <<<, 很有可能有一個轉(zhuǎn)換操作符:面積大于操作符,
>>>. 因此,查詢優(yōu)化器可以自由的將下面查詢從:
box '((0,0), (1,1))' >>> MYBOXES.description
轉(zhuǎn)換到
MYBOXES.description <<< box '((0,0), (1,1))'
這就允許執(zhí)行代碼總是使用后面的形式而某種程度上簡化了查詢優(yōu)化器.
類似地,如果存在負(fù)號操作符則也應(yīng)該聲明。 假設(shè)一個操作符,面積相等, ===,存
在,同樣有一個面積不等操作符, !==. 負(fù)號操作符允許查詢優(yōu)化器將
NOT MYBOXES.description === box '((0,0), (1,1))'

簡化成
MYBOXES.description !== box '((0,0), (1,1))'
如果提供了一個交換操作符名稱, PostgreSQL 將在表中查找它.如果找到,而且其本
身沒有一個交換符,那么交換符表將被更新,以當(dāng)前(最 新)創(chuàng)建的操作符作為它的
交換符.這一點(diǎn)一樣適用于負(fù)號操作符. 這就允許定義兩個互為交換符或負(fù)號符的操
作符.第一個操作符應(yīng)該定義為沒有交換符 或負(fù)號符(as appropriate). 當(dāng)定義第
二個操作符時,將第一個符號作為交換符或負(fù)號符.第一個將因上述的副作用一樣被更
新(而獲得交換符 或負(fù)號符).(對于PostgreSQL 6.5, 把兩個操作符指向?qū)Ψ酵瑯?br /> 也行。)

HASHES,SORT1 和 SORT2 選項(xiàng)將為查詢優(yōu)化器進(jìn)行連接查詢時提供支持.
PostgreSQL 能夠總是用反復(fù)替換來計算一個連接(也就是說,處理這樣的子句,該子
句有兩個元組變量, 這兩個變量被一個操作符分開,這個操作符返回一個boolean量)
[WONG76]. 另外, PostgreSQL 可以延著 [SHAP86]實(shí)現(xiàn)一個散列-連接算法
(hash-join algorithm);但是,我們必須知道這個策略是否可行.目前的散列-連
接算法只是對代表相等 測試的操作符有效;而且,數(shù)據(jù)類型的相等必須意味著類型的
表現(xiàn)是按位相等的。 (例如,一個包含未用的位的數(shù)據(jù)類型,這些位對相等測試沒有
影響,但卻不能用于哈希連接。)HASHES 標(biāo)記告訴優(yōu)化器, 對這個操作符可以安全地
使用哈希連接。
類似的,兩目排序操作符告訴查詢優(yōu)化器一個融合-排序 (merge-sort)是否是一個
可用的連接策略,并且告訴優(yōu)化器使用哪個操作符來對這兩個操 作數(shù)表排序.排序操
作符應(yīng)該只提供給相等操作符, 并且它們應(yīng)該對應(yīng)用于相應(yīng)的左邊和右邊數(shù)據(jù)類型的
小于操作符。
如果發(fā)現(xiàn)有其他聯(lián)合策略可用, PostgreSQL 將更改優(yōu)化器和運(yùn)行時系統(tǒng)以利用這些策
略,并且在定義一個操作符時將需要更多的聲明.幸運(yùn)的是,研究 團(tuán)隊(duì)不經(jīng)常發(fā)明新
的聯(lián)合策略, 而且增加用戶定義聯(lián)合策略的方法看來與其實(shí)現(xiàn)的復(fù)雜性相比是不值得
的。
RESTRICT 和 JOIN 選項(xiàng)幫助優(yōu)化器計算結(jié)果的尺寸大小.如果像下面的語句:
MYBOXES.description <<< box '((0,0),(1,1))'
在判斷條件中出現(xiàn),那么 PostgreSQL 將不得不估計 MYBOXES 中滿足該子句的記錄數(shù)
量的范圍的大小. 函數(shù) res_proc 必需是一個注冊過的函數(shù)(也就是說它已經(jīng)用
CREATE FUNCTION定義過了),它接受一個正確數(shù)據(jù)的數(shù)據(jù)類型作為參數(shù),返回一個浮
點(diǎn)數(shù). 查詢優(yōu)化器只是簡單的調(diào) 用這個函數(shù),將參數(shù) ((0,0),(1,1)) 傳入并且把結(jié)
果乘以關(guān)系(表)尺寸以獲得所需要的記錄的數(shù)值。
類似的,當(dāng)操作符的兩個操作數(shù)都包含記錄變量時, 優(yōu)化器必須計算聯(lián)合結(jié)果的尺
寸. 函數(shù) join_proc 將返回另一個浮點(diǎn)數(shù),這個數(shù)就是將兩個表相關(guān) 的記錄相乘,
計算出預(yù)期結(jié)果的尺寸.
函數(shù)
my_procedure_1 (MYBOXES.description, box '((0,0), (1,1))')

和操作符
MYBOXES.description === box '((0,0), (1,1))'
之間的區(qū)別是 PostgreSQL 試圖優(yōu)化操作符并且可以決定使用索引來縮小相關(guān)操作符的
搜索區(qū)間.但是,對函數(shù)將不會有任何優(yōu)化的動作,而且是強(qiáng)制 執(zhí)行.最后,函數(shù)可
有任意個參數(shù),而操作符限于一個或兩個.
注意
請參閱 PostgreSQL 用戶手冊 中操作符章節(jié)獲取更多信息.請使用 DROP OPERATOR 從
數(shù)據(jù)庫中刪除用戶定義操作符.
用法
下面命令定義一個新操作符,面積相等,用于 BOX 數(shù)據(jù)類型.
CREATE OPERATOR === (
LEFTARG = box,
RIGHTARG = box,
PROCEDURE = area_equal_procedure,
COMMUTATOR = ===,
NEGATOR = !==,
RESTRICT = area_restriction_procedure,
JOIN = area_join_procedure,
HASHES,
SORT1 = <<<,
SORT2 = <<<
);
兼容性 SQL92
CREATE OPERATOR是 PostgreSQL 擴(kuò)展. 在中沒有 CREATE OPERATOR 語句.

----------------------------------------------------------------------------
----

CREATE RULE
CREATE RULE
Name
CREATE RULE? --? 定義一個新的重寫規(guī)則
Synopsis
CREATE RULE name AS ON event
TO object [ WHERE condition ]
DO [ INSTEAD ] action

這里 action 可以是:

NOTHING
|
query
|
( query ; query ... )
|
[ query ; query ... ]

輸入
name
創(chuàng)建的規(guī)則名.
event
事件是 SELECT, UPDATE,DELETE 或 INSERT 之一.
object
對象是 table 或 table.column.(目前只有 table 形式實(shí)際上是實(shí)現(xiàn)了的.
condition
任意 SQL 布爾條件表達(dá)式.條件表達(dá)式除了引用 new 和 old 之外不能引用任何表.
query
組成 action 的查詢可以是任何 SQL SELECT,INSERT, UPDATE,DELETE,或 NOTIFY
語句之一.
在 condition 和 action 里,特殊表名字 new 和 old 可以用于指向引用表 (
object) 里的數(shù)值 new 在 ON INSERT 和 ON UPDATE 規(guī)則里 可以指向被插入或更新
的新行. old 在 ON UPDATE,和 ON DELETE 規(guī)則里可以指向現(xiàn)存的被更新,或者刪除
的行.
輸出
CREATE
成功創(chuàng)建規(guī)則后的返回信息.
描述
PostgreSQL 規(guī)則系統(tǒng) 允許我們在從數(shù)據(jù)庫或表中更新, 插入或刪除東西時定義一個
可選的動作來執(zhí)行。目前,規(guī)則用于實(shí)現(xiàn)表視圖。
規(guī)則的語意是在一個單獨(dú)的記錄正被訪問,更新,插入或刪除時, 將存在一個舊記錄
(用于檢索,更新和刪除)和一個新記錄 (用于更新和追加).這時給定事件類型和
給定目標(biāo)對象(表)的所有規(guī)則都將被檢查, (順序不定). 如果在 WHERE (如果
有)子句里面所聲明的 condition? 為真,那么 action 部分的規(guī)則就被執(zhí)行. 如果
聲明了 INSTEAD,那么 action 就會代替原來的查詢;否則,如果是 ON INSERT 那么
它在原來的查詢之后執(zhí)行,如果是 ON UPDATE 或者 ON DELETE,那么它在原來的查詢
之前執(zhí)行.在 condition 和 action 里面, 在舊記錄里字段的數(shù)值和/或新記錄里字
段的數(shù)值被 old. attribute-name 和 new. attribute-name 代替.
規(guī)則的 action 部分可以由一條或者多條查詢組成.要寫多個查詢,用圓括弧或者方括
弧 把它們包圍起來. 這樣的查詢將以聲明的順序執(zhí)行(只是我們不能保證對一個對象
的多個規(guī)則的執(zhí)行順序). action 還可以是 NOTHING 表示沒有動作.因此,一個 DO
INSTEAD NOTHING 規(guī)則制止了原來的查詢的運(yùn)行(當(dāng)條件為真時); DO NOTHING 規(guī)則
是沒有用的.
規(guī)則的 action 部分 執(zhí)行的時候帶有和觸發(fā)動作的用戶命令相同的命令和事務(wù)標(biāo)識
符.
規(guī)則和視圖
目前,ON SELECT 規(guī)則必須是無條件的 INSTEAD 規(guī)則并且 必須有一個由一條 SELECT
查詢組成的動作.因此,一條 ON SELECT 規(guī)則有效地把對象表轉(zhuǎn)成視圖,它的可見內(nèi)
容 是規(guī)則的 SELECT 查詢返回的記錄而不是存儲在表中的內(nèi)容(如果有的話). 我們
認(rèn)為寫一條 CREATE VIEW 命令比創(chuàng)建一個表然后定義一條 ON SELECT 規(guī)則在上面的風(fēng)
格要好.
CREATE VIEW 創(chuàng)建一個虛擬表(沒有下層的存儲) 以及相關(guān)的 ON SELECT 規(guī)則.系統(tǒng)不
允許對視圖進(jìn)行更新, 因?yàn)樗涝谝晥D上沒有真正的表.你可以創(chuàng)建一個可以更新
的視圖的幻覺, 方法是在視圖上定義 ON INSERT,ON UPDATE,和 ON DELETE 規(guī)則
(或者滿足你需要的任何上述規(guī)則的子集),用合適的對其它表的更新替換 在視圖上更
新的動作.
如果你想在視圖更新上使用條件規(guī)則,那么這里就有一個補(bǔ)充∶ 對你希望在視圖上允
許的每個動作,你都必須有一個無條件的 INSTEAD 規(guī)則.如果規(guī)則是有條件的,或者
它不是 INSTEAD, 那么系統(tǒng)仍將拒絕執(zhí)行更新動作的企圖,因?yàn)樗J(rèn)為它最終會在某
種 程度上在虛擬表上執(zhí)行動作. 如果你想處理?xiàng)l件規(guī)則上的所由有用的情況,那也可
以;只需要增加一個無條件的 DO INSTEAD NOTHING 規(guī)則確保系統(tǒng)明白它將決不會被
調(diào)用來更新虛擬表就可以了.然后把條件規(guī)則做成非 INSTEAD; 在這種情況下,如果
它們被觸發(fā),那么它們就增加到缺省的 INSTEAD NOTHING 動作中.
注意
為了在表上定義規(guī)則,你必須有規(guī)則定義權(quán)限. 用 GRANT 和 REVOKE 修改權(quán)限.
有一件很重要的事情是要避免循環(huán)規(guī)則. 比如,盡管下面兩條規(guī)則定義都是
PostgreSQL 可以接受的, select 命令會導(dǎo)致 PostgreSQL 報告 一條錯誤信息,因?yàn)?br /> 該查詢循環(huán)了太多次:
CREATE RULE bad_rule_combination_1 AS
ON SELECT TO emp
DO INSTEAD
SELECT * FROM toyemp;
CREATE RULE bad_rule_combination_2 AS
ON SELECT TO toyemp
DO INSTEAD
SELECT * FROM emp;
下面這個對 EMP 的查詢企圖將導(dǎo)致 PostgreSQL 產(chǎn)生一個錯誤信息, 因?yàn)樵摬樵冄h(huán)
了太多次:
SELECT * FROM emp;
目前,如果一個規(guī)則包含一個 NOTIFY 查詢,那么該 NOTIFY 將被 無條件執(zhí)行 --- 也
就是說,如果規(guī)則不施加到任何行上頭,該 NOTIFY 也會被發(fā)出.比如,在
CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable;
UPDATE mytable SET name = 'foo' WHERE id = 42;
里,一個 NOTIFY 事件將在 UPDATE 的時候發(fā)出,不管是否有某行的 id = 42.這是一
個實(shí)現(xiàn)的限制,將來的版本應(yīng)該修補(bǔ)這個毛?。?br /> 兼容性 SQL92
CREATE RULE語句是 PostgreSQL 語言的擴(kuò)展. 在里沒有CREATE RULE 語句.

----------------------------------------------------------------------------
----

CREATE SEQUENCE
CREATE SEQUENCE
Name
CREATE SEQUENCE? --? 創(chuàng)建一個新的序列發(fā)生器
Synopsis
CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT increment ]
[ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
[ START start ] [ CACHE cache ] [ CYCLE ]
輸入
TEMPORARY 或 TEMP
如果聲明了這個修飾詞,那么該序列對象只為這個會話創(chuàng)建, 并且在會話結(jié)束的時候
自動刪除.在臨時序列存在的時候, 同名永久序列是不可見的(在同一會話里).
seqname
將要創(chuàng)建的序列號名.
increment
INCREMENT increment 子句是可選的.一個正數(shù)將生成一個遞增的序列, 一個負(fù)數(shù)將
生成一個遞減的序列.缺省值是一(1).
minvalue
可選的子句 MINVALUE minvalue 決定一個序列可生成的最小值.缺省分別是遞增序列
為 1 遞減為 -2^63-1.
maxvalue
使用可選子句 MAXVALUE maxvalue 決定序列的最大值.缺省的分別是遞增為
-2^63-1,遞減為 -1.
start
可選的 START start 子句 使序列可以從任意位置開始.缺省初始值是遞增序列為
minvalue 遞減序列為 maxvalue.
cache
CACHE cache 選項(xiàng)使序列號預(yù)分配并且為快速訪問存儲在內(nèi)存里面. 最小值(也是缺
省值)是1(一次只能生成一個值, 也就是說沒有緩存).
CYCLE
可選的 CYCLE 關(guān)鍵字可用于使序列到達(dá) 最大值(maxvalue) 或 最小值(minvalue)
時可復(fù)位并繼續(xù)下去.如果達(dá)到極限,生成的下一個數(shù)據(jù)將分別是 最小值
(minvalue) 或 最大值(maxvalue).如果沒有 CYCLE,那么在到達(dá)極限之后再調(diào)用
nextval 將返回錯誤.
輸出
CREATE
命令成功執(zhí)行的返回信息.
ERROR: Relation 'seqname' already exists
如果聲明的序列已經(jīng)存在.
ERROR: DefineSequence: MINVALUE (start) can't be >= MAXVALUE (max)
如果聲明的初始值超出范圍,返回此信息.
ERROR: DefineSequence: START value (start) can't be < MINVALUE (min)
如果聲明的初始值超出范圍,返回此信息.
ERROR: DefineSequence: MINVALUE (min) can't be >= MAXVALUE (max)
如果最小值和最大值不連貫.
描述
CREATE SEQUENCE將向當(dāng)前數(shù)據(jù)庫里增加一個新的序列號生成器. 包括創(chuàng)建和初始化一
個新的名為 seqname的 單行表.生成器將為使用此命令的用戶"所有".
在序列創(chuàng)建后,你可以使用函數(shù) nextval, currval 和 nextval 操作序列.這些函數(shù)
在用戶手冊中有詳細(xì)文檔.
盡管你不能直接更新一個序列,但你可以使用象
SELECT * FROM seqname;

檢查一個序列的參數(shù)和當(dāng)前狀態(tài).特別是序列的 last_value 字段顯示了任意后端進(jìn)程
分配的最后的數(shù)值. (當(dāng)然,這些值在被打印出來的時候可能已經(jīng)過時了 --- 如果其
它進(jìn)程 正積極地使用 nextval.)
Caution
如果用語序列對象的cache 設(shè)置大于一, 而且該對象可能被多個后端同時使用就有可
能產(chǎn)生不可預(yù)料的結(jié)果.每個后端 在訪問過序列對象并遞增序列對象的 last_value
后, 將分配跟在序列值后面"緩存數(shù)".這樣,該后端在下面的 cache-1 次nextval調(diào)
用將使用預(yù)分配好的數(shù)值, 而不對共享對象做任何更新. 所以,任何已經(jīng)分配但在會
話中沒有使用的數(shù)字 將在會話結(jié)束時丟失.而且,盡管多個后端保證分配獨(dú)立的序列
值, 當(dāng)考慮所有的后端時該數(shù)值卻有可能是亂序的.(例如,設(shè)置 cache為10, 后端
A 可能保留數(shù)值 1..10 并且返回nextval=1, 而后端 B 可能保留數(shù)值 11..20 并在后
端 A 生成nextval=2 之 前返回 nextval=11.)因此, 將cache 設(shè)為一可以安全地假
設(shè)nextval的數(shù)值是順序生成的; 當(dāng)緩存數(shù)設(shè)置大于一,我 們只能假設(shè)nextval值都是
獨(dú)立的, 而不能假設(shè)它們都是純粹順序生成的. 同樣,last_value將反映由任何后端
保留的最 后數(shù)值,不管它是不是nextval曾返回過的. 另外一個問題是在這樣的序列
上執(zhí)行的 setval 將不會被 其它后端知曉,直道它們用光所有預(yù)先分配的緩存數(shù)值.
注意
使用 DROP SEQUENCE 語句來刪除序列.
序列是基于 bigint 運(yùn)算的,因此其范圍不能超過八字節(jié)的 整數(shù)范圍
(-9223372036854775808 到 9223372036854775807).在一些老一點(diǎn)的平臺上可能沒有
對八字節(jié)整數(shù)的編譯器支持, 這種情況下序列使用普通的 integer 運(yùn)算(范圍是
-2147483648 到 +2147483647).
如果 cache 大于一,那么每個后端使用其自身的緩存來存儲分配的數(shù)字. 已分配但當(dāng)
前會話沒有使用的數(shù)字將丟失,導(dǎo)致序列里面出現(xiàn)"空洞".
用法
創(chuàng)建一個叫 serial的遞增序列,從101開始:
CREATE SEQUENCE serial START 101;
從此序列中選出下一個數(shù)字:
SELECT nextval ('serial');
nextval
-------
114
在一個 INSERT 中使用此序列:
INSERT INTO distributors VALUES (nextval('serial'),'nothing');
在一個 COPY FROM 后更新序列:
BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;
兼容性 SQL92
CREATE SEQUENCE是 PostgreSQL 語言擴(kuò)展. 在里沒有 CREATE SEQUENCE 語句.

----------------------------------------------------------------------------
----

CREATE TABLE AS
CREATE TABLE AS
Name
CREATE TABLE AS -- 從一條查詢的結(jié)果中創(chuàng)建一個新表
Synopsis
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [,
...] ) ]
AS query
描述
CREATE TABLE AS創(chuàng)建一個表并且用來自 SELECT 命令計算出來的數(shù)據(jù)填充該表. 該表
的字段和 SELECT 輸出字段 的名字及類型相關(guān).(只不過你可以通過明確地給出一個字
段名字 列表來覆蓋 SELECT 的字段名).
CREATE TABLE AS和創(chuàng)建視圖有點(diǎn)象, 不過兩者之間實(shí)在是有比較大差異∶它創(chuàng)建一個
新表并且只對 SELECT 計算一次來填充這個新表. 新表不能跟蹤 SELECT 的源表隨后
做的變化. 相比之下,每次做查詢的時候,視圖都重新計算 SELECT.
這條命令和 SELECT INTO有相同的功能, 但是我們建議你多用這條命令,因?yàn)樗幌?br /> SELECT ... INTO 語法那樣融合和一些其它用法混淆. ,
參數(shù)
[LOCAL] TEMPORARY 或 [LOCAL] TEMP
如果聲明了這個選項(xiàng),則該表作為臨時表創(chuàng)建. 臨時表在會話退出的時候自動刪除.
在該臨時表存在的期間(本次會話), 同名的永久表是不可見的. 任何在臨時表上創(chuàng)建的
索引也自動是臨時的.
LOCAL 關(guān)鍵字是可選的.
table_name
要創(chuàng)建的表名.這個表不能是已經(jīng)存在的. 不過,臨時表可以創(chuàng)建為和現(xiàn)有永久表同
名. (譯注∶這里指的是同名臨時表或永久表不能已經(jīng)存在)
column_name
字段的名稱.多字段的名稱可以用逗號分隔的字段名列表聲明. 如果沒有提供字段名
子,那么就從查詢的輸出字段名中獲?。?br /> query
有效的查詢語句(也就是一條 SELECT 命令),請參考 SELECT 獲取可以使用的語法的描
述.
診斷
請參考 CREATE TABLE和 SELECT 獲取可能的輸出的概要.
注意
這條命令從功能上等效于 SELECT INTO , 但是我們更建議你用這個命令,因?yàn)樗惶?br /> 可能和 SELECT ... INTO 語法的其它方面的使用混淆.
兼容性 SQL92
這條命令是根據(jù) Oracle 的一個特性 制作的.在 或 SQL99 中沒有功能相等的命
令.不過, 把CREATE TABLE 和 INSERT ... SELECT 組合起來可以通過略微多一些的
工作完成同樣的事情.
歷史
自 PostgreSQL 6.3 開始就已經(jīng)有 CREATE TABLE AS 命令了.
又見
CREATE TABLE, CREATE VIEW , SELECT , SELECT INTO

----------------------------------------------------------------------------
----

CREATE TABLE
CREATE TABLE
Name
CREATE TABLE? --? 定義一個新表
Synopsis
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
{ column_name data_type [ DEFAULT default_expr ] [ column_constraint [,
... ] ]
| table_constraint } [, ... ]
)
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH OIDS | WITHOUT OIDS ]

這里 column_constraint 可以是:

[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY |
CHECK (expression) |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL ]??? [
ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

而 table_constraint 可以是:

[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] ) | PRIMARY KEY ( column_name [, ...
] ) |
CHECK ( expression ) |
FOREIGN KEY ( column_name [, ...
] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ]
}
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

描述
CREATE TABLE將在當(dāng)前數(shù)據(jù)庫創(chuàng)建一個新的, 初始為空的表.該表將由發(fā)出此命令的
用戶所有.
CREATE TABLE還自動創(chuàng)建一個數(shù)據(jù)類型, 該數(shù)據(jù)類型代表對應(yīng)該表一行的元組類型(結(jié)
構(gòu)類型). 因此,表不能和一個現(xiàn)有數(shù)據(jù)類型同名.
一個表的字段數(shù)不能超過 1600.(實(shí)際上,真正的限制比這低, 因?yàn)檫€有元組長度的
約束).表不能和系統(tǒng)表同名.
可選的約束子句聲明約束(或者測試),新行或者更新的行必須滿足這些約束才能成功插
入或更新.約束是一個命名的規(guī)則∶ 它是一個 SQL 對象,它通過對發(fā)生在表上的插
入,更新或者刪除操作的結(jié)果進(jìn)行限制來協(xié)助我們定義有效的數(shù)值集合.
定義約束又兩種方法∶表約束和列約束.一個列約束是作為 一個列定義的一部分定義
的.而表約束并不和某個列綁在一起,它可以作用于多于一個列上.每個列約束也可以
寫成表約束; 如果某個約束只影響一個列,那么列約束只是符號上的簡潔方式而已.
參數(shù)
[LOCAL] TEMPORARY 或 [LOCAL] TEMP
如果聲明了此參數(shù),則該表創(chuàng)建為臨時表.臨時表在會話結(jié)束時自動刪除. 現(xiàn)有同名
永久表在臨時表存在期間在本會話過程中是不可見的.任何在臨時表上創(chuàng)建的索引也都
會自動刪除.
關(guān)鍵字 LOCAL 是可選的.又見 兼容性 SQL92 .
table_name
要創(chuàng)建的表的名字.
column_name
在新表中要創(chuàng)建的字段名字.
data_type
該字段的數(shù)據(jù)類型.它可以包括數(shù)組說明符.請參考 用戶手冊獲取有關(guān)數(shù)據(jù)類型和數(shù)
組的更多信息.
DEFAULT default_expr
DEFAULT 子句給它所出現(xiàn)的字段一個缺省數(shù)值.該數(shù)值可以是任何不含變量的表達(dá)式
(不允許使用子查詢和對本 表中的其它字段的交叉引用).缺省表達(dá)式的數(shù)據(jù)類型必須
和字段類型匹配.
缺省表達(dá)式將被用于任何未聲明該字段數(shù)值的插入操作. 如果字段上沒有缺省值,那
么缺省是 NULL.
INHERITS ( parent_table [, ... ] )
可選的 INHERITS 子句聲明一列表,這個新表自動從這列表 中繼承所有字段.如果在
多于一個父表中存在同名的字段,那么就會報告一個錯誤,除非這些字段的數(shù)據(jù)類型在
每個父表里都是匹配的. 如果沒有沖突,那么重復(fù)的字段在新表中融合成一個字段.
如果新表的字段名列表中包括和繼承的字段同名的,那么它的數(shù)據(jù)類型也必須和上面一
樣與繼承字段匹配,并且這些字段定義會融合成一個. 不過,同名的繼承和新字段聲
明可以聲明不同的約束∶所有的繼承過來的約束以及聲明的約束都融合到一起,并且全
部應(yīng)用于新表. 如果新表為該字段明確的聲明了一個缺省數(shù)值,那么此缺省數(shù)值覆蓋
任何 來自繼承字段聲明的缺省值.否則,任何為該字段聲明了缺省數(shù)值的父表都必須
聲明相同的缺省,否則就會報告一個錯誤.
WITH OIDS 或 WITHOUT OIDS
這個可選的子句聲明新表中的行是否應(yīng)該擁有賦予它們的 OID (對象標(biāo)識). 缺省是有
OID.(如果新表從任何有 OID 的表繼承而來,那么就算 這條命令說了 WITHOUT
OIDS,也會強(qiáng)制 WITH OIDS.)
聲明 WITHOUT OIDS 允許用戶禁止為行或者表生成 OID. 這么做對大表是值得的,因
為這樣可以減少 OID 消耗并且推遲 32 位 OID 計數(shù)器的消耗.一旦該計數(shù)器重疊,那
么就不能再假設(shè) OID 的唯一,這樣它的實(shí)用性就大打折扣.
CONSTRAINT constraint_name
列或表約束的可選名字.如果沒有聲明,則由系統(tǒng)生成一個名字.
NOT NULL
字段不允許包含 NULL 數(shù)值.等效于列約束 CHECK (column NOT NULL).
NULL
該字段允許包含 NULL 數(shù)值.這是缺?。?br /> 這個子句的存在只是為和那些非標(biāo)準(zhǔn) SQL 數(shù)據(jù)庫兼容. 我們不建議在新應(yīng)用中使用
它.
UNIQUE (column constraint)
UNIQUE ( column_name [, ... ] ) (table constraint)
UNIQUE 聲明一個規(guī)則,該規(guī)則表示一個表里的一個或者多個獨(dú)立的字段組合的分組只
能包含唯一的數(shù)值.表的唯一約束 的行為和列約束的一樣,只不過多了跨多行的能
力.
對于唯一約束的用途而言,系統(tǒng)認(rèn)為 NULL 數(shù)值是不相等的.
每個唯一表約束都必須命名一個字段的集合,該集合必須和其它唯一 約束命名字段集
合或者該表定義的主鍵約束不同.(否則就只是同樣的 約束寫了兩次.)
PRIMARY KEY (column constraint)
PRIMARY KEY ( column_name [, ... ] ) (table constraint)
主鍵約束表明表中的一個或者一些字段只能包含唯一(不重復(fù))非 NULL 的數(shù)值. 從技
術(shù)上講,PRIMARY KEY 只是 UNIQUE 和 NOT NULL 的組合,不過把一套字段標(biāo)識為主鍵
同時也體現(xiàn)了大綱設(shè)計的元數(shù)據(jù),因?yàn)橹麈I意味著其它表可以拿這套字段 用做行的唯
一標(biāo)識.
一個表只能聲明一個主鍵,不管是作為字段約束還是表約束.
主鍵約束應(yīng)該定義在同個表上的一個與其它唯一約束所定義的不同的字段集合上.
CHECK (expression)
CHECK 約束聲明一個完整性約束或者測試,一次插入或者更新操作若想成功則必須滿足
這個條件. 每個約束都必須是一個生成布爾結(jié)果的表達(dá)式.一個在字段定義中出現(xiàn)的
目前,CHECK 表達(dá)式不能包含子查詢或者 引用除本行字段之外的變量.
REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action
] [ ON UPDATE action ] (column constraint)
FOREIGN KEY ( column [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] )
] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (table
constraint)
REFERENCES 列約束聲明一個由新表中一列或者多列組成的組應(yīng)該只包含匹配引用的表
reftable 中對應(yīng)引用的字段 refcolumn 中的數(shù)值. 如果省略 refcolumn, 則使用
reftable 的主鍵. 被引用字段必須是被引用表中的唯一字段或者主鍵.
向這些字段增加的數(shù)值將使用給出的匹配類型與參考表中的參考列 中的數(shù)值進(jìn)行匹
配.有三種匹配類型∶MATCH FULL, MATCH PARTIAL,和一種缺省匹配類型(如果沒有
聲明 匹配類型的話).MATCH FULL 將不允許一個多字段外鍵的 字段為 NULL,除非所
有外鍵字段都為 NULL.缺省匹配類型允許某些 外鍵字段為 NULL 而外鍵的其它部分不
是 NULL.MATCH PARTIAL 還沒實(shí)現(xiàn).
另外,當(dāng)被參考字段中的數(shù)據(jù)改變的時候,那么將對本表的字段中的數(shù)據(jù) 執(zhí)行某種操
作.ON DELETE 子句聲明當(dāng)被參考表中的 被參考行將被刪除的時候要執(zhí)行的操作.類
似,ON UPDATE 子句聲明被參考表中被參考字段更新為新值的時候要執(zhí)行的動作.如果
該行被更新,但被參考的字段實(shí)際上沒有變化,那么就不會有任何動作. 下面是每個
子句的可能的動作∶
NO ACTION
生成一個錯誤,表明刪除或者更新將產(chǎn)生一個違反外鍵約束的動作. 它是缺省動作.
RESTRICT
和 NO ACTION 一樣.
CASCADE
刪除任何引用了被刪除行的行,或者分別把引用行的字段值更新為 被參考字段的新數(shù)
值.
SET NULL
把引用行數(shù)值設(shè)置為 NULL.
SET DEFAULT
把引用列的數(shù)值設(shè)置為它們的缺省值.
如果主鍵字段經(jīng)常更新,那么我們給 REFERENCES 字段增加一個索引可能是合適的,這
樣與 REFERENCES 字段 相關(guān)聯(lián)的 NO ACTION 和 CASCADE 動作可以更有效地執(zhí)行.
DEFERRABLE 或 NOT DEFERRABLE
這兩個關(guān)鍵字設(shè)置該約束是否可推遲.一個不可推遲的約束將在每條命令之后 馬上檢
查.可以推遲的約束檢查可以推遲到事務(wù)結(jié)尾 (使用 SET CONSTRAINTS命令).缺省是
NOT DEFERRABLE.目前只有外鍵約束 接受這個子句.所有其它約束類型都是不可推遲
的.
INITIALLY IMMEDIATE or INITIALLY DEFERRED
如果約束是可推遲的,那么這個子句聲明檢查約束的缺省時間. 如果約束是
INITIALLY IMMEDIATE, 那么每條語句之后就檢查它.這個是缺?。绻s束是
INITIALLY DEFERRED,那么只有在事務(wù)結(jié)尾才檢查它. 約束檢查的時間可以用 SET
CONSTRAINTS命令修改.
診斷
CREATE
如果表成功創(chuàng)建,返回此信息.
ERROR
如果表創(chuàng)建失敗返回這條信息.通常它還帶著一些描述性文本, 比如∶ ERROR:
Relation 'table' already exists,這個錯誤出現(xiàn)在運(yùn)行時 -- 如果聲明的表已經(jīng)在
數(shù)據(jù)庫中存在了.
注意
如果一個應(yīng)用使用了 OID 標(biāo)識表中的特定行,那么我們建議在該表的 oid 字段上創(chuàng)建
一個唯一約束,以確保該表的 OID 即使在計數(shù)器重疊之后也是唯一的.如果你需要一
個整個數(shù)據(jù)庫范圍的唯一 標(biāo)識,那么就要避免假設(shè) OID 是跨表唯一的,你可以用
tableoid 和行 OID 的組合來實(shí)現(xiàn)這個目的. (將來的 PostgreSQL 很可能為每個表使
用獨(dú)立 的 OID 計數(shù)器,因此包括 tableoid 組成數(shù)據(jù)庫范圍內(nèi) 的唯一標(biāo)識將是必須
的,而不是可選的.)
提示: 對那些沒有主鍵的表,我們不建議使用 WITHOUT OIDS, 因?yàn)槿绻葲]有 OID
又沒有唯一數(shù)據(jù)鍵字,那么就很難標(biāo)識特定的行.
PostgreSQL 自動為每個唯一約束和主鍵約束 創(chuàng)建一個索引以確保唯一性.因此,我們
不必為主鍵字段創(chuàng)建明確的索引. (參閱 CREATE INDEX獲取更多信息.)
SQL 92 標(biāo)準(zhǔn)認(rèn)為 CHECK 字段約束只能引用它們施加的字段; 只有 CHECK 表約束可以
引用多個字段. PostgreSQL 并未強(qiáng)制這樣的限制; 它把字段約束和表約束看成是類
似的.
唯一約束和主鍵在目前的實(shí)現(xiàn)里是不能繼承的. 這樣,如果把繼承和唯一約束組合在
一起會導(dǎo)致無法運(yùn)轉(zhuǎn).
例子
創(chuàng)建表 films 和 distributors∶
CREATE TABLE films (
code??????? CHARACTER(5) CONSTRAINT firstkey PRIMARY KEY,
title?????? CHARACTER VARYING(40) NOT NULL,
did???????? DECIMAL(3) NOT NULL,
date_prod?? DATE,
kind??????? CHAR(10),
len???????? INTERVAL HOUR TO MINUTE
);
CREATE TABLE distributors (
did??? DECIMAL(3) PRIMARY KEY DEFAULT NEXTVAL('serial'),
name?? VARCHAR(40) NOT NULL CHECK (name <> '')
);
創(chuàng)建一個帶有 2 維數(shù)組的表∶
CREATE TABLE array (
vector INT[][]
);
為表 films 定義一個唯一表約束. 唯一表約束可以在表的一個或多個字段上定義∶
CREATE TABLE films (
code??????? CHAR(5),
title?????? VARCHAR(40),
did???????? DECIMAL(3),
date_prod?? DATE,
kind??????? VARCHAR(10),
len???????? INTERVAL HOUR TO MINUTE,
CONSTRAINT production UNIQUE(date_prod)
);
定義一個檢查列約束∶
CREATE TABLE distributors (
did???? DECIMAL(3) CHECK (did > 100),
name??? VARCHAR(40)
);
定義一個檢查表約束∶
CREATE TABLE distributors (
did???? DECIMAL(3),
name??? VARCHAR(40)
CONSTRAINT con1 CHECK (did > 100 AND name <> '')
);
為表 films 定義一個主鍵表約束. 主鍵表約束可以定義在表上的一個或多個字段.
CREATE TABLE films (
code??????? CHAR(5),
title?????? VARCHAR(40),
did???????? DECIMAL(3),
date_prod?? DATE,
kind??????? VARCHAR(10),
len???????? INTERVAL HOUR TO MINUTE,
CONSTRAINT code_title PRIMARY KEY(code,title)
);
為表 distributors 定義一個主鍵約束. 下面兩個例子是等效的,第一個例子使用了
表約束語法,第二個使用了列約束表示法.
CREATE TABLE distributors (
did???? DECIMAL(3),
name??? CHAR VARYING(40),
PRIMARY KEY(did)
);
CREATE TABLE distributors (
did???? DECIMAL(3) PRIMARY KEY,
name??? VARCHAR(40)
);
下面這個例子給字段 name 賦予了一個文本常量 缺省值,并且將字段 did 的缺省值安
排為 通過選擇序列對象的下一個值生成.modtime 的缺省值將是該行插入的時候的時
間.
CREATE TABLE distributors (
name????? VARCHAR(40) DEFAULT 'luso films',
did?????? INTEGER DEFAULT NEXTVAL('distributors_serial'),
modtime?? TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
在表 distributors 上定義兩個 NOT NULL 列約束,其中之一明確給出了名字∶
CREATE TABLE distributors (
did???? DECIMAL(3) CONSTRAINT no_null NOT NULL,
name??? VARCHAR(40) NOT NULL
);
為 name 字段定義一個唯一約束∶
CREATE TABLE distributors (
did???? DECIMAL(3),
name??? VARCHAR(40) UNIQUE
);
上面的和下面這樣作為一個表約束聲明是一樣的∶
CREATE TABLE distributors (
did???? DECIMAL(3),
name??? VARCHAR(40),
UNIQUE(name)
);
兼容性 SQL92
CREATE TABLE遵循 和 SQL99 的一個子集 的中間狀態(tài),一些例外情況在下面和上面的
診斷中列出.
臨時表
除了局部臨時表之外, 還定義了 CREATE GLOBAL TEMPORARY TABLE 語句. 全局臨時
表也可以在其它會話中可見.
對于臨時表,有一個可選的 ON COMMIT 子句∶
CREATE { GLOBAL | LOCAL } TEMPORARY TABLE table ( ... ) [ ON COMMIT {
DELETE | PRESERVE } ROWS ]
ON COMMIT 子句表明該臨時表在執(zhí)行 COMMIT 的時候是否應(yīng)該清空行. 如果省略了 ON
OMMIT 子句, 聲明缺省是 ON COMMIT DELETE ROWS.不過, PostgreSQL 的行為總是
類似 ON COMMIT PRESERVE ROWS.
NULL "約束"
NULL "約束"(實(shí)際上不是約束) 是 PostgreSQL 對 的擴(kuò)展,包括它是為了和其它一些
RDBMS 兼容(以及為了和 NOT NULL 約束對稱).因?yàn)樗侨魏巫侄蔚娜笔?,所以它的?br /> 現(xiàn)只是噪音而已.
斷言
斷言是一種特殊類型的完整性約束,它和其它約束共享相同的名字空間. 不過,斷言
和約束不同的是,它不一定依賴于某個特定的表,因此 提供了 CREATE ASSERTION 語
句作為定義 約束的一個可選的方法∶
CREATE ASSERTION name CHECK ( condition )
PostgreSQL 目前還沒有實(shí)現(xiàn)斷言.
繼承
通過 INHERITS 子句的多重繼承是 PostgreSQL 語言的擴(kuò)展. SQL99(但不包括 )使用
不同的語法和語義定義了單繼承. SQL99 風(fēng)格的繼承還沒有在 PostgreSQL 中實(shí)現(xiàn).
對象 ID
PostgreSQL 的 OID 的概念不是標(biāo)準(zhǔn).
又見
ALTER TABLE , DROP TABLE

----------------------------------------------------------------------------
----

CREATE TRIGGER
Name
CREATE TRIGGER? --? 定義一個新的觸發(fā)器
Synopsis
CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] }
ON table FOR EACH { ROW | STATEMENT }
EXECUTE PROCEDURE func ( arguments )
輸入
name
賦予新觸發(fā)器的名稱.
table
現(xiàn)有表名稱.
event
INSERT,DELETE 或 UPDATE 之一.
func
一個用戶提供的函數(shù).
輸出
CREATE
如果觸發(fā)器成功創(chuàng)建,返回此信息.
描述
CREATE TRIGGER將向現(xiàn)有數(shù)據(jù)庫中增加一個新的觸發(fā)器. 觸發(fā)器將與表 table 相聯(lián)并
且將執(zhí)行聲明的函數(shù) func.
觸發(fā)器可以聲明為在對記錄進(jìn)行操作之前 在檢查約束之前和 INSERT,UPDATE 或
DELETE 執(zhí)行前)或之后(在檢 查約束之后和完成 INSERT, UPDATE 或 DELETE 操
作)觸發(fā). 如果觸發(fā)器在事件之前,觸發(fā)器可能略過當(dāng)前記錄 的操作或改變被插入的
(當(dāng)前)記錄(只對 INSERT 和 UPDATE 操作有效). 如果觸發(fā)器在事件之后,所有
更改,包括最后的插入, 更新或刪除對觸發(fā)器都是"可見"的.
SELECT并不更改任何行,因此你不能創(chuàng)建 SELECT 觸發(fā)器.這種場合下規(guī)則和視圖更合
適些.
請參考 PostgreSQL 程序員手冊中SPI 和觸發(fā)器章節(jié)獲取更多信息.
注意
CREATE TRIGGER是 PostgreSQL 語言擴(kuò)展.
只有表所有者可以就此表創(chuàng)建一個觸發(fā)器.
在當(dāng)前的版本,STATEMENT 觸發(fā)器還沒有實(shí)現(xiàn).
請參考 DROP TRIGGER 獲取如何刪除觸發(fā)器的信息.
用法
在插入或更新表 films 之前檢查一下聲明的分銷商代碼是否存在于 distributors 表
中:
CREATE TRIGGER if_dist_exists
BEFORE INSERT OR UPDATE ON films FOR EACH ROW
EXECUTE PROCEDURE check_primary_key ('did', 'distributors', 'did');

在刪除或更新一個分銷商的內(nèi)容之前, 將所有記錄移到表 films 中:
CREATE TRIGGER if_film_exists
BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW
EXECUTE PROCEDURE check_foreign_key (1, 'CASCADE', 'did', 'films',
'did');
兼容性 SQL92
在 里沒有 CREATE TRIGGER語句.
上面第二個例子可以使用一個 FOREIGN KEY 約束實(shí)現(xiàn):
CREATE TABLE distributors (
did????? DECIMAL(3),
name???? VARCHAR(40),
CONSTRAINT if_film_exists
FOREIGN KEY(did) REFERENCES films
ON UPDATE CASCADE ON DELETE CASCADE
);

----------------------------------------------------------------------------
----

CREATE TYPE
CREATE TYPE
Name
CREATE TYPE? --? 定義一個新的數(shù)據(jù)類型
Synopsis
CREATE TYPE typename ( INPUT = input_function, OUTPUT = output_function
, INTERNALLENGTH = { internallength | VARIABLE }
[ , EXTERNALLENGTH = { externallength | VARIABLE } ]
[ , DEFAULT = default ]
[ , ELEMENT = element ] [ , DELIMITER = delimiter ]
[ , SEND = send_function ] [ , RECEIVE = receive_function ]
[ , PASSEDBYVALUE ]
[ , ALIGNMENT = alignment ]
[ , STORAGE = storage ]
)
輸入
typename
將要創(chuàng)建的類型名.
internallength
一個文本串,說明新類型的內(nèi)部長度.
externallength
一個文本串,說明新類型的外部(顯示)長度.
input_function
一個函數(shù)的名稱,由 CREATE FUNCTION創(chuàng)建,將數(shù)據(jù)從外部類型轉(zhuǎn)換成內(nèi)部類型.
output_function
一個函數(shù)的名稱,由 CREATE FUNCTION創(chuàng)建,將數(shù)據(jù)從內(nèi)部格式轉(zhuǎn)換成適于顯示的形
式.
element
被創(chuàng)建的類型是數(shù)組;這個聲明數(shù)組元素的類型.
delimiter
將用做數(shù)組的數(shù)據(jù)元素之間分隔符的字符.
default
該類型的缺省值.通常是省略它的,所以缺省是 NULL.
send_function
用 CREATE FUNCTION 創(chuàng)建的函數(shù)名,它將該類型的數(shù)據(jù)轉(zhuǎn)換成一個適合傳輸?shù)狡渌麢C(jī)
器的形式.
receive_function
用 CREATE FUNCTION 創(chuàng)建的函數(shù)名,將該類型從適于傳輸給其他機(jī)器的形式轉(zhuǎn)換為內(nèi)
部形式.
alignment
該數(shù)據(jù)類型的存儲對齊要求.如果聲明了,必須是 'char', 'int2', 'int4' 或
'double'; 缺省是 'int4'.
storage
該數(shù)據(jù)類型的存儲技術(shù).如果聲明了,必須是 'plain','external', 'extended',
或 'main'; 缺省是 'plain'.
輸出
CREATE
如果創(chuàng)建類型成功,返回此信息.
描述
CREATE TYPE允許用戶在 PostgreSQL 當(dāng)前數(shù)據(jù)庫里創(chuàng)建一個新的用戶數(shù)據(jù)類型.定義
該類型的用戶成為其所有者. typename 是新類型的名稱而且必須在所定義的數(shù)據(jù)庫中
唯一.
CREATE TYPE需要在定義類型之前先注冊兩個函數(shù)(用 CREATE FUNCTION 命令). 新
的基本類型的形式由 input_function決定,它將該類型的外部形式轉(zhuǎn)換成可以被對該
類型操作的操作符和函數(shù)識別的形式. 自然, output_function 用做相反用途. 輸
入函數(shù)可以聲明為接受一個類型為 opaque 的參數(shù),或者接受三個類型分別為
opaque,OID,int4 的參數(shù). (第一個參數(shù)是 C 字串形式的輸入文本,第二個是在該
類型為數(shù)組類型時 其元素的類型,第三個是目標(biāo)字段的 typmod,如果已知的話.) 輸
出函數(shù)可以聲明為接受一個類型為 opaque 的參數(shù), 或者接受兩個類型為 opaque,
OID 的參數(shù). (第一個參數(shù)實(shí)際上是數(shù)據(jù)類型本身,但是因?yàn)檩敵龊瘮?shù)必須首先聲明,
所以把它聲明為接受 opaque 類型更簡單.第二個參數(shù)也是 用于數(shù)組類型的數(shù)組元素
類型.)
新的基本數(shù)據(jù)類型可定義成為定長,這時 internallength 是一個正整數(shù),也可以是變
長的,通過把 internallength 設(shè)置為 VARIABLE 表示.(在內(nèi)部,這個狀態(tài)是通過將
typlen 設(shè)置為 -1 實(shí)現(xiàn)的.)所有變長類型的內(nèi)部形式 都必須以一個整數(shù)開頭,這個
整數(shù)給出此類型這個數(shù)值的全長.
外部表現(xiàn)形式的長度類似使用 externallength 關(guān)鍵字 聲明.(目前這個值沒有使用,
通常是省略的,這樣就缺省是 VARIABLE.)
要表示一個類型是數(shù)組,用 ELEMENT 關(guān)鍵字聲明數(shù)組元素的 類型.比如,要定義一個
4 字節(jié)整數(shù)("int4")的數(shù)組,聲明
ELEMENT = int4
有關(guān)數(shù)組類型的更多細(xì)節(jié)在下面描述.
要聲明用于這種類型數(shù)組的外部形式的數(shù)值之間的分隔符,可用 delimiter 聲明指定
分隔符.缺省的分隔符是逗號(','). 請注意分隔符是和數(shù)組元素類型相關(guān)聯(lián),而不是
數(shù)組類型本身.
如果用戶希望字段的數(shù)據(jù)類型缺省時不是 NULL,而是其它什么東西,那么你可以聲明
一個缺省值. 在 DEFAULT 關(guān)鍵字里面聲明缺省值. (這樣的缺省可以被附著在特定字
段上的明確的 DEFAULT 子句覆蓋.)
可選的參數(shù) send_function 和 receive_function 目前還沒有使用,并且通常被忽略
(允許它們分別缺省為 output_function 和 input_function.) 這些函數(shù)將來可能復(fù)
活過來用于聲明與機(jī)器相關(guān)的二進(jìn)制表現(xiàn).
可選的標(biāo)簽 PASSEDBYVALUE 表明該數(shù)據(jù)類型是通過傳值傳遞的而不是傳引用.請注意
你不能對那些內(nèi)部形式超過 Datum 類型寬度 (大多數(shù)機(jī)器上是四字節(jié),有少數(shù)機(jī)器上
是八字節(jié).) 的類型進(jìn)行傳值.
alignment關(guān)鍵字 聲明該數(shù)據(jù)類型要求的對齊存儲方式.允許的數(shù)值等效于按照 1,
2, 4,或者 8 字節(jié)邊界對齊.請注意變長類型必須有至少 4 字節(jié)的對齊, 因?yàn)樗鼈?br /> 必須包含一個 int4 作為它們的第一個成份.
storage關(guān)鍵字 允許為變長數(shù)據(jù)類型選擇 TOAST 存儲方法 (定長類型只允許使用
plain). plain 為該數(shù)據(jù)類型關(guān)閉 TOAST:它將 總是用內(nèi)聯(lián)的方式而不是壓縮的方
式存儲. extended 是 TOAST 完全兼容的:系統(tǒng)將首先試圖壓縮 一個長的數(shù)據(jù)值,然
后如果它仍然太長的話就將它的值移出主表的行. external 允許將值移出主表的行,
但系統(tǒng)將不會壓縮它. main 允許壓縮,但是不贊成把數(shù)值移動出主表.(用這種存儲
方法的數(shù)據(jù)項(xiàng)可能仍將移動出主表,如果不能放在一行里的話, 但是它們將比
extended 和 external 項(xiàng)更愿意呆在主表里.)
數(shù)組類型
在創(chuàng)建用戶定義數(shù)據(jù)類型的時候,PostgreSQL 自動創(chuàng)建一個與之關(guān)聯(lián)的數(shù)組類型,其
名字由該基本類型的名字前綴一個下劃線組成.分析器理解這個命名傳統(tǒng),并且把對類
型為 foo[] 的字段的請求轉(zhuǎn)換成對類型為 _foo 的字段的請求.這個隱含創(chuàng)建的數(shù)組
類型是變長并且 使用內(nèi)建的輸入和輸出函數(shù) array_in 和 array_out.
你很可能會問"如果系統(tǒng)自動制作正確的數(shù)組類型,那為什么有個 ELEMENT選項(xiàng)?"使用
ELEMENT 有用的唯一 的場合是在你制作的定長類型碰巧在內(nèi)部是一個 N 個相同事物的
數(shù)組, 而你又想允許這 N 個事物可以通過腳標(biāo)直接關(guān)聯(lián),以及那些你準(zhǔn)備 把該類型
當(dāng)做整體進(jìn)行的操作.比如,類型 name 就允許其 構(gòu)成 char 用這種方法關(guān)聯(lián).一個
二維的 point 類型也可以允許其兩個構(gòu)成浮點(diǎn)型按照類似 point[0] 和 point[1] 的
方法關(guān)聯(lián). 請注意這個功能只適用與那些內(nèi)部形式完全是 N 個相等字段的定長類
型.一個可以腳標(biāo)化的變長類型必須有被 array_in 和 array_out 使用的一般化的內(nèi)
部表現(xiàn)形式.出于歷史原因(也就是說,那些明顯錯誤但補(bǔ)救來得太遲的 問題),定長
數(shù)組類型的腳標(biāo)從零開始,而不是象變長類型那樣的從一開始.
注意
類型名不能以下劃線("_") 開頭而且只能有 30 個字符長.(或者通常是
NAMEDATALEN-2, 而不是其它名字那樣的可以有 NAMEDATALEN-1 個字符). 以下劃線
開頭的類型名被解析成內(nèi)部創(chuàng)建的數(shù)組類型名.
例子
這個命令創(chuàng)建box數(shù)據(jù)類型,并且將這種類型用于一個表定義:
CREATE TYPE box (INTERNALLENGTH = 16,
INPUT = my_procedure_1, OUTPUT = my_procedure_2);
CREATE TABLE myboxes (id INT4, description box);

如果 box 的內(nèi)部結(jié)構(gòu)是一個四個 float4 的數(shù)組,我們可以說
CREATE TYPE box (INTERNALLENGTH = 16,
INPUT = my_procedure_1, OUTPUT = my_procedure_2,
ELEMENT = float4);
它允許一個 box 的數(shù)值成分 float 可以用腳標(biāo)關(guān)聯(lián). 否則該類型和前面的行為一
樣.
這條命令創(chuàng)建一個大對象類型并將其用于一個表定義:
CREATE TYPE bigobj (INPUT = lo_filein, OUTPUT = lo_fileout,
INTERNALLENGTH = VARIABLE);
CREATE TABLE big_objs (id int4, obj bigobj);

兼容性 SQL92
CREATE TYPE命令是 PostgreSQL 擴(kuò)展.在 SQL99 里 有一個 CREATE TYPE 語句,但是
細(xì)節(jié)上和 PostgreSQL 的有比較大區(qū)別.
又見
CREATE FUNCTION , DROP TYPE , PostgreSQL 程序員手冊

----------------------------------------------------------------------------
----

CREATE USER
Name
CREATE USER? --? 創(chuàng)建一個新的數(shù)據(jù)庫用戶帳戶
Synopsis
CREATE USER username [ [ WITH ] option [ ... ] ]
這里 option 可以是∶

SYSID uid
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| IN GROUP groupname [, ...]
| VALID UNTIL 'abstime'
輸入
username
用戶名
uid
SYSID 子句可以用于選擇正在被創(chuàng)建的用戶的 PostgreSQL 用戶標(biāo)識。 這個用戶標(biāo)識
不需要和 UNIX 系統(tǒng)用戶標(biāo)識匹配,但是有些人愿意讓兩者相同。
如果沒有聲明這個,缺省使用已分配的最高用戶標(biāo)識加一。
[ encrypted | unencrypted ] password
設(shè)置用戶的口令,如果你不準(zhǔn)備使用口令認(rèn)證, 那么你可以省略這個選項(xiàng),否則該用
戶將不能聯(lián)接到一個口令認(rèn)證的服務(wù)器上。
ENCRYPTED/UNENCRYPTED 控制口令在數(shù)據(jù)庫中是否以加密 形式存儲.使用加密口令存
儲的時候老的客戶端可能有通訊問題.
參閱 管理員手冊中關(guān)于客戶端認(rèn)證的部分 獲取關(guān)于如何設(shè)置認(rèn)證機(jī)制的詳細(xì)信息。
CREATEDB
NOCREATEDB
這個子句定義用戶的創(chuàng)建數(shù)據(jù)庫權(quán)限. 如果聲明了 CREATEDB,被定義的用戶將允許創(chuàng)
建其自己的數(shù)據(jù)庫.而使用 NOCREATEDB 將否決該用戶的創(chuàng)建數(shù)據(jù)庫的能力. 如果忽
略本子句,缺省是 NOCREATEDB.
CREATEUSER
NOCREATEUSER
該子句決定一個用戶是否能創(chuàng)建一個新的用戶. 這個選項(xiàng)同樣把次用戶變成數(shù)據(jù)庫超
級用戶,可以跨越所有 訪問限制。省略這個參數(shù)將置用戶的這個屬性為
NOCREATEUSER.
groupname
一個組名稱,把這個用戶設(shè)為該組成員。 你可以列出多個組名字.
abstime
VALID UNTIL (有效期)子句設(shè)置一個絕對時間,過了該時間后用戶的 PostgreSQL 登
陸將不再有效. 如果省略這個子句,登陸將總是有效的.
輸出
CREATE USER
如果命令成功完成,返回此信息.
描述
CREATE USER將向一個 PostgreSQL 實(shí)例增加一個新用戶.參考管理員手冊獲取關(guān)于管
理用戶和認(rèn)證的信息。 要執(zhí)行這條命令,你必須是一個數(shù)據(jù)庫超級用戶。
使用 ALTER USER修改用戶的口令和權(quán)限, DROP USER刪除一個用戶。 使用 ALTER
GROUP從組中增加或刪除用戶。 PostgreSQL 里有一個腳本 createuser與此命令相同的
功能(實(shí)際上,它調(diào)用這條命令), 但是可以在命令行上運(yùn)行。
用法
創(chuàng)建一個沒有口令的用戶:
CREATE USER jonathan
創(chuàng)建一個有口令的用戶:
CREATE USER davide WITH PASSWORD 'jw8s0F4'
創(chuàng)建一個有口令的用戶,其帳號在2001年底失效. 注意當(dāng)2002年走過一秒后,該帳號
將不再有效:
CREATE USER miriam WITH PASSWORD 'jw8s0F4' VALID UNTIL 'Jan 1 2002'
創(chuàng)建一個擁有創(chuàng)建數(shù)據(jù)庫權(quán)限的用戶:
CREATE USER manuel WITH PASSWORD 'jw8s0F4' CREATEDB
兼容性 SQL92
在里沒有CREATE USER 語句.

----------------------------------------------------------------------------
----

CREATE VIEW
Name
CREATE VIEW? --? 定義一個視圖
Synopsis
CREATE VIEW view AS SELECT query
輸入
view
所要創(chuàng)建的視圖名稱.
query
一個將為視圖提供行和列的 SQL 查詢.
請參閱 SELECT 語句獲取有效參數(shù)的更多信息.
輸出
CREATE
如果視圖創(chuàng)建成功,返回此信息.
ERROR: Relation 'view' already exists
如果在數(shù)據(jù)庫中已經(jīng)存在所聲明的視圖.
NOTICE: Attribute 'column' has an unknown type
如果不聲明,所創(chuàng)建的視圖將有一個未知類型的字段. 例如,下面命令返回一個警
告:
CREATE VIEW vista AS SELECT 'Hello World'

然而下面命令將不出現(xiàn)警告:
CREATE VIEW vista AS SELECT text 'Hello World'

描述
CREATE VIEW將定義一個表的視圖. 這個視圖不是物理上實(shí)際存在(于磁盤)的.具體
的說,自動生成 一個改寫索引規(guī)則的查詢用以支持在視圖上的檢索.
注意
目前,視圖是只讀的∶系統(tǒng)將不允許在視圖上插入,更新,或者刪除數(shù)據(jù).你可以通過
在視圖上創(chuàng)建把插入等動作重寫為向其它表做合適操作的規(guī)則來 實(shí)現(xiàn)可更新視圖的效
果.更多信息詳見 CREATE RULE .
使用 DROP VIEW 語句刪除視圖.
用法
創(chuàng)建一個由所有 Comedy (喜?。╇娪敖M成的視圖:
CREATE VIEW kinds AS
SELECT *
FROM films
WHERE kind = 'Comedy';
SELECT * FROM kinds;

code |?????????? title????????? | did | date_prod | kind | len
-------+---------------------------+-----+------------+--------+-------
UA502 | Bananas?????????????????? | 105 | 1971-07-13 | Comedy | 01:22
C_701 | There's a Girl in my Soup | 107 | 1970-06-11 | Comedy | 01:36
(2 rows)
兼容性 SQL92
為 CREATE VIEW 聲明了一些附加的功能:
CREATE VIEW view [ column [, ...] ]
AS SELECT expression [ AS colname ] [, ...]
FROM table [ WHERE condition ]
[ WITH [ CASCADE | LOCAL ] CHECK OPTION ]
完整的命令可選的子句是:
CHECK OPTION
這個選項(xiàng)用于可更新視圖. 所有對視圖的 INSERT 和 UPDATE 都要經(jīng)過視圖定義條件
的校驗(yàn). 如果 沒有通過校驗(yàn),更新將被拒絕.
LOCAL
對這個視圖進(jìn)行完整性檢查.
CASCADE
對此視圖和任何相關(guān)視圖進(jìn)行完整性檢查. 在既沒有聲明 CASCADE 也沒有聲明 LOCAL
時,假設(shè)為 CASCADE.

----------------------------------------------------------------------------
----

DECLARE
DECLARE
Name
DECLARE? --? 定義一個游標(biāo)
Synopsis
DECLARE cursorname [ BINARY ] [ INSENSITIVE ] [ SCROLL ]
CURSOR FOR query
[ FOR { READ ONLY | UPDATE [ OF column [, ...] ] ]
輸入
cursorname
將在隨后 FETCH 操作中使用的游標(biāo)名.
BINARY
令游標(biāo)以二進(jìn)制而不是文本格式獲取數(shù)據(jù).
INSENSITIVE
關(guān)鍵字, 表明從游標(biāo)檢索出來的數(shù)據(jù)不應(yīng)該被其他進(jìn)程或游標(biāo)的更新動作影響. 因
為在 PostgreSQL 里,游標(biāo)的操作總是發(fā)生在事務(wù) 里,所以總是符合上面描述.這個
關(guān)鍵字沒有作用.
SCROLL
關(guān)鍵字,表明每個 FETCH 操作可以檢索出多行數(shù)據(jù). 因?yàn)樵赑ostgreSQL 在任何情況
下都允許這樣, 所以這個關(guān)鍵字沒有作用.
query
一個 SQL 查詢,它提供由游標(biāo)控制的行. 請參考 SELECT 語句獲取有關(guān)有效參數(shù)的詳
細(xì)信息.
READ ONLY
關(guān)鍵字,表明游標(biāo)將用于只讀模式. 因?yàn)檫@是 PostgreSQL 唯一的游標(biāo)訪問模式,所
以該關(guān)鍵字沒有作用.
UPDATE
關(guān)鍵字,表明游標(biāo)將被用于更新表. 因?yàn)橛螛?biāo)更新目前還不被 PostgreSQL 支持,所
以這個關(guān)鍵字將產(chǎn)生一個錯誤信息.
column
將被更新的列.因?yàn)橛螛?biāo)更新目前不被 PostgreSQL 支持, 所以 UPDATE 子句將產(chǎn)生
一個錯誤信息.
輸出
SELECT
如果 SELECT 成功運(yùn)行,返回此信息.
NOTICE: Closing pre-existing portal "cursorname"
如果在當(dāng)前的事務(wù)塊中此游標(biāo)名稱已經(jīng)定義,返回此信息. 前面定義的游標(biāo)被丟棄.
ERROR: DECLARE CURSOR may only be used in begin/end transaction blocks
如果一個游標(biāo)沒有在事務(wù)塊內(nèi)部定義,返回此信息.
描述
DECLARE允許用戶創(chuàng)建游標(biāo), 用于在一個大的查詢里面檢索少數(shù)幾行數(shù)據(jù). 使用
FETCH,游標(biāo)可以既可以返回文本也可以返回二進(jìn)制格式。 .
通常游標(biāo)返回文本格式,要么是 ASCII 要么是某種由 PostgreSQL 特定的后端決定的
編碼方式. 因?yàn)閿?shù)據(jù)在系統(tǒng)內(nèi)部是用二進(jìn)制格式存儲的, 系統(tǒng)必須對數(shù)據(jù)做一定轉(zhuǎn)換
以生成文本格式.另外,文本格式一般都比對應(yīng)的二進(jìn)制格式占的存儲空間大. 一旦
格式轉(zhuǎn)換回文本,客戶應(yīng)用需要將文本轉(zhuǎn)換為二進(jìn)制格式來操作. BINARY 游標(biāo)給你返
回內(nèi)部二進(jìn)制形態(tài)的數(shù)據(jù)。
作為例子,如果查詢從一個整數(shù)列返回一個一, 在通常的游標(biāo)里你將獲得一個字符串
'1'而如果是一個二進(jìn)制查詢,你將得到一個 4-字節(jié)的等于ctrl-A('^A')的數(shù)值.
游標(biāo)應(yīng)該小心使用 BINARY. 一些用戶應(yīng)用如 psql 是不識別二進(jìn)制游標(biāo)的, 而且期
望返回的數(shù)據(jù)是文本格式.
而且,字符串表示方式是與硬件體系無關(guān)的, 而二進(jìn)制格式會因不同的硬件體系不同
而不同,而且 PostgreSQL 對二進(jìn)制游標(biāo)不做字節(jié)序解析或者其他格式轉(zhuǎn)換 。 因此,
如果你的客戶機(jī)和服務(wù)器使用不同的格式 (如: "高位高字節(jié)" 和 "底位底字節(jié)
").你可能就不會希望你的數(shù)據(jù) 以二進(jìn)制格式返回.所以二進(jìn)制游標(biāo)將比文本略微快
一點(diǎn),因?yàn)槎M(jìn)制在服務(wù)器和客戶端的數(shù)據(jù)傳輸中有較少的轉(zhuǎn)換.
小技巧: 如果你希望用 ASCII 顯示數(shù)據(jù), 將數(shù)據(jù)以 ASCII 模式訪問將節(jié)省客戶端的
工作.
注意
游標(biāo)只能在事務(wù)中使用.使用 BEGIN, COMMIT和 ROLLBACK定義一個事務(wù)塊。
在 中游標(biāo)只能在嵌入 SQL (ESQL) 的應(yīng)用中使用. PostgreSQL 后端沒有一個明確的
OPEN cursor 語句;一個游標(biāo)被認(rèn)為在定義時就已經(jīng)打開了. 不過,PostgreSQL嵌入
的 SQL 預(yù)編譯器, ecpg, 支持 習(xí)慣,包括那些和 DECLARE 和 OPEN 相關(guān)的語句.
用法
定義一個游標(biāo):
DECLARE liahona CURSOR
FOR SELECT * FROM films;
兼容性 SQL92
只允許在嵌入的 SQL 中和模塊中使用游標(biāo). PostgreSQL 允許交互地使用游標(biāo). 允
許嵌入或模塊的游標(biāo)更新數(shù)據(jù)庫信息. 所有 PostgreSQL 的游標(biāo)都是只讀的. BINARY
關(guān)鍵字是 PostgreSQL 擴(kuò)展.

----------------------------------------------------------------------------
----

DELETE
DELETE
Name
DELETE? --? 刪除一個表中的行
Synopsis
DELETE FROM [ ONLY ] table [ WHERE condition ]

輸入
table
一個現(xiàn)存表的名字
condition
這是一個 SQL 選擇查詢,它返回要被刪除的行.
請參考 SELECT 語句獲取關(guān)于 WHERE 子句的更多信息.
輸出
DELETE count
如果行被成功的刪除返回此信息. count 是要被刪除的行數(shù).
如果 count 為 0, 沒有行被刪除.
描述
DELETE從指明的表里刪除滿足 WHERE condition (條件)的行.
如果 condition (WHERE 子句)不存在, 效果是刪除表中所有行.結(jié)果是一個有效的
空表.
小技巧: TRUNCATE 是一個 PostgreSQL 擴(kuò)展, 它提供一個更快的從表中刪除所有行的
機(jī)制。
缺省時DELETE將刪除所聲明的表和所有它的子表的記錄. 如果你希望只更新提到的
表,你應(yīng)該使用OLNY子句.
要對表進(jìn)行修改,你必須有寫權(quán)限,同樣也必須有讀表的權(quán)限,這樣才能對符合
condition(條件) 的值進(jìn)行讀取操作.
用法
刪除所有電影(films)但不刪除音樂(musicals):
DELETE FROM films WHERE kind <> 'Musical';
SELECT * FROM films;

code |?????????? title?????????? | did | date_prod | kind?? | len
-------+---------------------------+-----+------------+---------+-------
UA501 | West Side Story?????????? | 105 | 1961-01-03 | Musical | 02:32
TC901 | The King and I??????????? | 109 | 1956-08-11 | Musical | 02:13
WD101 | Bed Knobs and Broomsticks | 111 |??????????? | Musical | 01:57
(3 rows)
清空表 films:
DELETE FROM films;
SELECT * FROM films;

code | title | did | date_prod | kind | len
------+-------+-----+-----------+------+-----
(0 rows)
兼容性 SQL92
允許定位的 DELETE (刪除)語句:
DELETE FROM table WHERE
CURRENT OF cursor
這里 cursor 表示一個打開的游標(biāo). PostgreSQL 里交互式游標(biāo)是只讀的.

----------------------------------------------------------------------------
----

DROP AGGREGATE
DROP AGGREGATE
Name
DROP AGGREGATE? --? 刪除一個用戶定義的聚集函數(shù)
Synopsis
DROP AGGREGATE name type
輸入
name
現(xiàn)存的聚集函數(shù)名。
type
現(xiàn)存的聚集函數(shù)的輸入數(shù)據(jù)類型,或者 * -- 如果這個聚集函數(shù)接受任意輸入類
型.(請參考 PostgreSQL 用戶手冊 獲取關(guān)于數(shù)據(jù)類型的更多信息)。
輸出
DROP
命令成功的返回信息.
ERROR: RemoveAggregate: aggregate 'name' for type type does not exist
如果聲明的函數(shù)在數(shù)據(jù)庫中不存在,返回此信息.
描述
DROP AGGREGATE將刪除對一個現(xiàn)存聚集函數(shù)的所有索引. 執(zhí)行這條命令的用戶必須是
該聚集函數(shù)的所有者.
注意
使用 CREATE AGGREGATE語句創(chuàng)建一個聚集函數(shù)。
用法
將類型 int4的聚集函數(shù) myavg 刪除:
DROP AGGREGATE myavg(int4);
兼容性 SQL92
在 中沒有 DROP AGGREGATE語句. 該語句是一個 PostgreSQL 語言的擴(kuò)展.

----------------------------------------------------------------------------
----

DROP DATABASE
Name
DROP DATABASE? --? 刪除一個數(shù)據(jù)庫.
Synopsis
DROP DATABASE name
輸入
name
要被刪除的現(xiàn)有數(shù)據(jù)庫名.
輸出
DROP DATABASE
如果命令成功執(zhí)行,返回此命令.
DROP DATABASE: cannot be executed on the currently open database
你不能和準(zhǔn)備刪除的數(shù)據(jù)庫建立聯(lián)接.你需要和 template1 或者任何其它的數(shù)據(jù)庫相
連來運(yùn)行這些命令.
DROP DATABASE: cannot be executed on the currently open database
執(zhí)行這條命令之前你必須先結(jié)束正在處理的事務(wù)。
描述
DROP DATABASE刪除一個現(xiàn)存數(shù)據(jù)庫的目錄入口并且刪除包含數(shù)據(jù)的目錄.只有數(shù)據(jù)庫
所有者能夠執(zhí)行這條命令(通常也是數(shù)據(jù)庫創(chuàng)建者).
DROP DATABASE不能撤銷,小心使用.
注意
這條命令在和目標(biāo)數(shù)據(jù)庫聯(lián)接時不能執(zhí)行. 通常更好的做法是用 dropdb腳本代替,該
腳本是此命令的一個封裝。 ,
請參考 CREATE DATABASE語句獲取如何創(chuàng)建數(shù)據(jù)庫的信息.
兼容性 SQL92

DROP DATABASE是一個 PostgreSQL 語言的擴(kuò)展. 在 中沒有這條命令.

----------------------------------------------------------------------------
----

DROP FUNCTION
Name
DROP FUNCTION? --? 刪除一個用戶定義的函數(shù)
Synopsis
DROP FUNCTION name ( [ type [, ...] ] )
輸入
name
現(xiàn)存的函數(shù)名稱.
type
函數(shù)參數(shù)的類型.
輸出
DROP
命令成功執(zhí)行的返回信息.
NOTICE RemoveFunction: Function "name" ("types") does not exist
如果當(dāng)前數(shù)據(jù)庫里不存在所聲明的函數(shù),返回此信息.
描述
DROP FUNCTION 將刪除一個現(xiàn)存的函數(shù)的引用.要執(zhí)行這條命令,用戶必須是函數(shù)的所
有者. 必須聲明函數(shù)的輸入?yún)?shù)類型,因?yàn)閹讉€不同的函數(shù)可能會有同樣的名字 和不
同的參數(shù)列表.
注意
請參考 CREATE FUNCTION 獲取創(chuàng)建聚集函數(shù)的信息.
對依賴于該函數(shù)的類型, 操作符訪問方式或者觸發(fā)器是否事先被刪除不做任何校驗(yàn).
用法
這條命令刪除平方根函數(shù):
DROP FUNCTION sqrt(int4);
兼容性 SQL92
DROP FUNCTION是 PostgreSQL 語言的擴(kuò)展.
SQL/PSM
SQL/PSM 是一個為實(shí)現(xiàn)函數(shù)擴(kuò)展能力而提出的標(biāo)準(zhǔn). SQL/PSM DROP FUNCTION 語句有
下面的語法:
DROP [ SPECIFIC ] FUNCTION name { RESTRICT | CASCADE }

----------------------------------------------------------------------------
----

DROP GROUP
DROP GROUP
Name
DROP GROUP? --? 刪除一個用戶組
Synopsis
DROP GROUP name

輸入
name
現(xiàn)存組名。
輸出
DROP GROUP
成功刪除組后返回的信息。
描述
DROP GROUP從數(shù)據(jù)庫中刪除指定的組。組中的用戶不被刪除。 組中的用戶不被刪除。
使用 CREATE GROUP增加新組,用 ALTER GROUP修改組的成員。
用法
刪除一個組:
DROP GROUP staff;
兼容性 SQL92

里沒有 DROP GROUP.

----------------------------------------------------------------------------
----

DROP INDEX
Name
DROP INDEX? --? 刪除一個索引
Synopsis
DROP INDEX index_name [, ...]
輸入
index_name
要刪除的索引名.
輸出
DROP
如果索引成功刪除返回的信息.
ERROR: index "index_name" does not exist
如果 index_name 不是這個數(shù)據(jù)庫的索引,返回此信息.
描述
DROP INDEX從數(shù)據(jù)庫中刪除一個現(xiàn)存的索引. 要執(zhí)行這個命令,你必須是索引的所有
者. the index.
注意
DROP INDEX是PostgreSQL 語言擴(kuò)展.
請參考 CREATE INDEX語句獲取如何創(chuàng)建索引的信息.
用法
此命令將刪除title_idx 索引:
DROP INDEX title_idx;
兼容性 SQL92
定義用于訪問純關(guān)系型數(shù)據(jù)庫的命令. 索引是一個與具體實(shí)現(xiàn)相關(guān)的特性,因而沒有
與具體實(shí)現(xiàn)相關(guān)的特性或定義在 語言里面.

----------------------------------------------------------------------------
----

DROP LANGUAGE
DROP LANGUAGE
Name
DROP LANGUAGE? --? 刪除一個用戶定義的過程語言
Synopsis
DROP [ PROCEDURAL ] LANGUAGE 'name'

輸入
name
現(xiàn)存語言的名稱.
輸出
DROP
如果語言成功刪除,返回此信息.
ERROR: Language "name" doesn't exist
如果語言 name 沒有找到,返回此信息.
描述
DROP PROCEDURAL LANGUAGE將刪除曾注冊過的過程語言 name.
注意
DROP PROCEDURAL LANGUAGE語句是 PostgreSQL 語言的擴(kuò)展.
請參考 CREATE LANGUAGE獲取如何創(chuàng)建過程語言的信息.
將不會校驗(yàn)用這種語言注冊的函數(shù)或觸發(fā)器是否仍然存在. 要想重新使用這些東西而
不用刪除和重新創(chuàng)建所有這些函數(shù), 函數(shù) pg_proc 的 prolang字段/屬性必須調(diào)整為
為 PL 重新創(chuàng)建的 pg_language 入口的新對象標(biāo)識( OID).
用法
下面命令刪除 PL/Sample 語言:
DROP PROCEDURAL LANGUAGE 'plsample';
兼容性 SQL92
在里沒有 DROP PROCEDURAL LANGUAGE.

----------------------------------------------------------------------------
----

DROP OPERATOR
DROP OPERATOR
Name
DROP OPERATOR? --? 刪除一個用戶定義操作符
Synopsis
DROP OPERATOR id ( lefttype | NONE , righttype | NONE )
輸入
id
一個現(xiàn)存的操作符的標(biāo)識符.
lefttype
該操作符左參數(shù)的類型.如果該操作符沒有左參數(shù), 寫 NONE.
righttype
該操作符右參數(shù)的類型.如果該操作符沒有右參數(shù), 寫 NONE.
輸出
DROP
命令成功執(zhí)行的返回函數(shù).
ERROR: RemoveOperator: binary operator 'oper' taking 'lefttype' and
'righttype' does not exist
如果聲明的雙目操作符不存在,返回此信息.
ERROR: RemoveOperator: left unary operator 'oper' taking 'lefttype' does not
exist
如果聲明的左目操作符不存在,返回此信息.
ERROR: RemoveOperator: right unary operator 'oper' taking 'righttype' does
not exist
如果聲明的右目操作符不存在,返回此信息.
描述
DROP OPERATOR語句從數(shù)據(jù)庫中刪除一個現(xiàn)存的操作符. 要執(zhí)行這個命令,你必須是操
作符所有者.
左目操作符的右類型或右目操作符的左類型可以聲明為 NONE.
注意
DROP OPERATOR語句是 PostgreSQL 語言擴(kuò)展.
請參考 CREATE OPERATOR獲取如何創(chuàng)建操作符的信息.
刪除任何依賴于被刪除的操作符的訪問模式和操作符表是用戶的責(zé)任.
用法
將用于int4的冪操作符 a^n 刪除:
DROP OPERATOR ^ (int4, int4);
刪除用于boolean變量的左目取反操作符(! b):
DROP OPERATOR ! (none, bool);
刪除用于 int4的階乘 (! i) : int4:
DROP OPERATOR ! (int4, none);
兼容性 SQL92
在里沒有 DROP OPERATOR 語句.

----------------------------------------------------------------------------
----

DROP RULE
DROP RULE
Name
DROP RULE? --? 刪除一個重寫規(guī)則
Synopsis
DROP RULE name [, ...]
輸入
name
要刪除的現(xiàn)存的規(guī)則.
輸出
DROP
刪除成功返回的信息.
ERROR: Rule or view "name" not found
如果聲明的規(guī)則不存在,返回此信息.
描述
DROP RULE從聲明的 PostgreSQL規(guī)則系統(tǒng)里刪除一個規(guī)則. PostgreSQL 將立即停止使
用之并且將會把它從系統(tǒng)表中清理出去.
注意
DROP RULE語句是 PostgreSQL 語言的擴(kuò)展.
請參考 CREATE RULE 獲取如何創(chuàng)建規(guī)則的信息.
一旦一個規(guī)則被刪除掉,該規(guī)則所寫的歷史記錄信息將可能不存在.
用法
刪除重寫規(guī)則 newrule:
DROP RULE newrule;
兼容性 SQL92
在 中沒有DROP RULE.

----------------------------------------------------------------------------
----

DROP SEQUENCE
DROP SEQUENCE
Name
DROP SEQUENCE? --? 刪除一個序列
Synopsis
DROP SEQUENCE name [, ...]
輸入
name
序列名.
輸出
DROP
序列成功刪除后返回的信息.
ERROR: sequence "name" does not exist
如果聲明的序列不存在,返回此信息.
描述
DROP SEQUENCE從數(shù)據(jù)庫中刪除序列號生成器. 因?yàn)槟壳暗男蛄袑?shí)現(xiàn)是作為一個特殊的
表,所以此語句就象 DROP TABLE 語句一樣.
注意
DROP SEQUENCE語句是 Postgres 語言擴(kuò)展.
請參考 CREATE SEQUENCE 語句獲取如何創(chuàng)建一個序列的信息.
用法
從數(shù)據(jù)庫中刪除序列 serial:
DROP SEQUENCE serial;
兼容性 SQL92
在里沒有 DROP SEQUENCE.

----------------------------------------------------------------------------
----

DROP TABLE
DROP TABLE
Name
DROP TABLE? --? 刪除一個表
Synopsis
DROP TABLE name [, ...]

輸入
name
要刪除的現(xiàn)存表或視圖.
輸出
DROP
如果命令成功完成,返回此信息.
ERROR: table "name" does not exist
果聲明的表或視圖在數(shù)據(jù)庫中不存在.
描述
DROP TABLE從數(shù)據(jù)庫中刪除表或視圖. 只有其所有者才能刪除一個表或視圖. 使用
DELETE 一個表可能沒有任何行,但不會被刪除.
如果被刪除的表有從索引,它們將首先被刪除. 從索引的刪除將對所屬表的內(nèi)容沒有
任何影響.
注意
請參考 CREATE TABLE 和 ALTER TABLE 獲取如何創(chuàng)建或更改表的信息.
用法
刪除 films 和 distributors表:
DROP TABLE films, distributors;
兼容性 SQL92
為 DROP TABLE 聲明了一些附加的功能:
DROP TABLE table { RESTRICT | CASCADE }

RESTRICT
確保只有不存在相關(guān)視圖或完整性約束的表才可以被刪除.
CASCADE
任何引用的視圖或完整性約束都將被刪除.
小技巧: 目前,要刪除一個視圖,你必須明確刪除之.

----------------------------------------------------------------------------
----

DROP TRIGGER
DROP TRIGGER
Name
DROP TRIGGER? --? 刪除一個觸發(fā)器定義.
Synopsis
DROP TRIGGER name ON table

輸入
name
現(xiàn)存的觸發(fā)器名.
table
表的名稱.
輸出
DROP
如果觸發(fā)器成功的刪除,返回此信息.
ERROR: DropTrigger: there is no trigger name on relation "table"
如果聲明的觸發(fā)器不存在,返回此信息.
描述
DROP TRIGGER將刪除所有對一個現(xiàn)存觸發(fā)器的引用. 要執(zhí)行這個命令,當(dāng)前用戶必須
是觸發(fā)器的所有者.
注意
DROP TRIGGER是 PostgreSQL 語言的擴(kuò)展.
請參考 CREATE TRIGGER 獲取如何創(chuàng)建觸發(fā)器的信息.
用法
刪除表films的if_dist_exists觸發(fā)器:
DROP TRIGGER if_dist_exists ON films;
兼容性 SQL92
在里沒有DROP TRIGGER.

----------------------------------------------------------------------------
----

DROP TYPE
DROP TYPE
Name
DROP TYPE? --? 刪除一個用戶定義數(shù)據(jù)類型
Synopsis
DROP TYPE typename [, ...]
輸入
typename
現(xiàn)存的類型名.
輸出
DROP
命令執(zhí)行成功的返回信息.
ERROR: RemoveType: type 'typename' does not exist
如果聲明的類型沒有找到,返回此信息.
描述
DROP TYPE將從系統(tǒng)表里刪除用戶的類型.
只有類型所有者可以刪除類型.
注意
DROP TYPE 語句是 PostgreSQL 語言的擴(kuò)展.
請參考 CREATE TYPE 獲取如何創(chuàng)建類型的信息.
用戶有責(zé)任刪除任何使用了被刪除類型的操作符,函數(shù),聚集,訪問模式, 子類型和
表.不過,相關(guān)等數(shù)組數(shù)據(jù)類型(由 CREATE TYPE 自動創(chuàng)建)將自動刪除.
如果刪除了一個內(nèi)建的類型,后端的行為將不可預(yù)測.
用法
刪除 box 類型:
DROP TYPE box;
兼容性 SQL92
SQL3
DROP TYPE是 SQL3 語句.

----------------------------------------------------------------------------
----

DROP USER
DROP USER
Name
DROP USER? --? 刪除一個數(shù)據(jù)庫用戶帳號
Synopsis
DROP USER name
輸入
name
一個現(xiàn)存用戶的名稱.
輸出
DROP USER
用戶被成功刪除的返回信息.
ERROR: DROP USER: user "name" does not exist
如果用戶名沒有找到,返回此信息.
DROP USER: user "name" owns database "name", cannot be removed
你必須先刪除數(shù)據(jù)庫或者改變其所有者。
描述
DROP USER從數(shù)據(jù)庫中刪除指定的用戶。 它不刪除數(shù)據(jù)庫里此用戶所有的表,視圖或其
他對象。 如果該用戶擁有任何數(shù)據(jù)庫,你會收到一個錯誤信息。
使用 CREATE USER增加新用戶,用 ALTER USER修改用戶屬性。 PostgreSQL 還有一個
腳本 dropuser,這個腳本和這條命令功能相同(實(shí)際上,腳本里調(diào)用此命令),但是
可以在命令行上運(yùn)行。
用法
刪除一個用戶帳戶:
DROP USER jonathan;
兼容性 SQL92
在里沒有DROP USER.

----------------------------------------------------------------------------
----

DROP VIEW
DROP VIEW
Name
DROP VIEW? --? 刪除一個視圖
Synopsis
DROP VIEW name [, ...] 輸入
name
現(xiàn)存視圖名稱.
輸出
DROP
命令成功執(zhí)行的返回.
ERROR: view name does not exist
如果聲明的視圖在數(shù)據(jù)庫中不存在,返回此信息.
描述
DROP VIEW從數(shù)據(jù)庫中刪除一個現(xiàn)存的視圖. 執(zhí)行這條命令必須是視圖的所有者.
注意
請參考CREATE VIEW 獲取關(guān)于如何創(chuàng)建視圖的信息.
用法
下面命令將刪除視圖 kinds:
DROP VIEW kinds; 兼容性 SQL92
為 DROP VIEW 聲明了一些附加的功能:
DROP VIEW view { RESTRICT | CASCADE }??? 輸入
RESTRICT
確保只有不存在關(guān)聯(lián)視圖或完整性約束的視圖可以被刪除.
CASCADE
任何引用的視圖和完整性約束都將被刪除.
注意
目前,要從 PostgreSQL 數(shù)據(jù)庫中刪除一個視圖, 你必須明確地將其刪除.

----------------------------------------------------------------------------
----

END
Name
END? --? 提交當(dāng)前的事務(wù)
Synopsis
END [ WORK | TRANSACTION ]
輸入
WORK
TRANSACTION
可選關(guān)鍵字。沒有作用。
輸出
COMMIT
事務(wù)成功提交后的返回信息。
NOTICE: COMMIT: no transaction in progress
如果沒有正在處理的事務(wù),返回此信息。
描述
END是 PostgreSQL 而 -兼容的同義語句是 COMMIT.
注意
關(guān)鍵字 WORK 和 TRANSACTION 是多余的,可以省略。
使用 ROLLBACK退出一個事務(wù)。
用法
令所有改變生效:
END WORK;
兼容性 SQL92
END是 PostgreSQL 的擴(kuò)展,提供與 COMMIT相同的功能。

----------------------------------------------------------------------------
----

EXPLAIN
EXPLAIN
Name
EXPLAIN? --? 顯示語句執(zhí)行規(guī)劃
Synopsis
EXPLAIN [ VERBOSE ] query
輸入
VERBOSE
顯示詳細(xì)查詢規(guī)劃的標(biāo)志.
query
任何 query (查詢).
輸出
NOTICE: QUERY PLAN: plan
PostgreSQL 后端明確的查詢規(guī)劃.
EXPLAIN
查詢規(guī)劃顯示后發(fā)送的標(biāo)志.
描述
這條命令顯示PostgreSQL規(guī)劃器為所提供的查詢生成的執(zhí)行規(guī)劃。執(zhí)行規(guī)劃顯示查詢引
用的表是如何被掃描的--- 是簡單的順序掃描,還是 索引掃描等 --- 并且如果引用了
多個表, 采用了什么樣的連接算法從每個輸入的表中取出所需要的記錄。
顯示出來的最關(guān)鍵的部分是預(yù)計的查詢執(zhí)行開銷, 這就是規(guī)劃器對運(yùn)行該查詢所需時
間的估計(以磁盤頁面存取為單位計量)。實(shí)際上顯示了兩個數(shù)字:返回第一條記錄前
的啟動時間, 和返回所有記錄的總時間。對于大多數(shù)查詢而言,關(guān)心的是總時間,但
是, 在某些環(huán)境下,比如一個 EXISTS 子查詢里, 規(guī)劃器將選擇最小啟動時間而不是
最小總時間 (因?yàn)閳?zhí)行器在獲取一條記錄后總是要停下來)。同樣, 如果你用一條
LIMIT 子句限制返回的記錄數(shù), 規(guī)劃器會在最終的開銷上做一個合理的插值以計算哪
個規(guī)劃開銷最省。
VERBOSE 選項(xiàng)輸出規(guī)劃樹在系統(tǒng)內(nèi)部的完整內(nèi)容, 而不僅僅是一個概要(并且還把它
發(fā)送給 postmaster 日志文件)。 通常這個選項(xiàng)只是對調(diào)試PostgreSQL有用。
注意
在 PostgreSQL 中只有很少的關(guān)于使用優(yōu)化器的開銷的文檔.通常的關(guān)于查詢優(yōu)化的開
銷的估算可以在數(shù)據(jù)庫的手冊中找到. 請參考 程序員手冊 中關(guān)于索引和基因查詢優(yōu)
化器的章節(jié)獲取更多信息.
用法
顯示一個對只有一個 int4 列和 128 行的表的簡單查詢的查詢規(guī)劃:
EXPLAIN SELECT * FROM foo;
NOTICE: QUERY PLAN:
Seq Scan on foo (cost=0.00..2.28 rows=128 width=4)
EXPLAIN
對同一個擁有支持查詢 equijoin 條件的索引的表, EXPLAIN 將顯示一個不同的規(guī)
劃:
EXPLAIN SELECT * FROM foo WHERE i = 4;
NOTICE: QUERY PLAN:
Index Scan using fi on foo (cost=0.00..0.42 rows=1 width=4)
EXPLAIN
最后,同一個擁有支持查詢 equijoin 條件的索引的表, EXPLAIN對使用一個聚集函數(shù)
的查詢將顯示下面內(nèi)容:
EXPLAIN SELECT sum(i) FROM foo WHERE i = 4;
NOTICE: QUERY PLAN:

Aggregate (cost=0.42..0.42 rows=1 width=4)
-> Index Scan using fi on foo (cost=0.00..0.42 rows=1 width=4)

注意這里顯示的數(shù)字, 甚至還有選擇的查詢策略都有可能在各個 PostgreSQL版本之間
不同--因?yàn)橐?guī)劃器在不斷改進(jìn)。
兼容性 SQL92

在 中沒有EXPLAIN 語句.

----------------------------------------------------------------------------
----

FETCH
Name
FETCH? --? 用游標(biāo)從表中抓取行
Synopsis
FETCH [ direction ] [ count ] { IN | FROM } cursor
FETCH [ FORWARD | BACKWARD | RELATIVE ] [ # | ALL | NEXT | PRIOR ] { IN |
FROM } cursor

輸入
direction
selector定義抓取的方向.它可以是下述之一:
FORWARD
抓取后面的行. selector 省略時這是缺省值.
BACKWARD
抓取前面行.
RELATIVE
為 兼容設(shè)置的多余鍵字.
count
count決定抓取幾行.可以是下列之一:
#
一個表明抓取幾行的整數(shù). 注意負(fù)整數(shù)等效于改變 FORWARD 和 BACKWARD 屬性.
ALL
檢索所有剩余的行.
NEXT
等效于聲明 count 為 1.
PRIOR
等效于聲明 count 為 -1.
cursor
一個打開的游標(biāo)的名稱.
輸出
FETCH返回由聲明游標(biāo)定義的查詢結(jié)果. 如果查詢失敗,將返回下面的信息:
NOTICE: PerformPortalFetch: portal "cursor" not found
如果 cursor 在前面沒有定義,返回此信息.游標(biāo)必須在一個事務(wù)塊中定義.
NOTICE: FETCH/ABSOLUTE not supported, using RELATIVE
PostgreSQL 不支持游標(biāo)的絕對定位.
ERROR: FETCH/RELATIVE at current position is not supported
允許我們用下面語句在"當(dāng)前位置"不停地檢索游標(biāo)
FETCH RELATIVE 0 FROM cursor.

PostgreSQL 目前不支持這種用法;實(shí)際上,零被保留用于檢索所有行, 等效于聲明
ALL 關(guān)鍵字.如果使用 RELATIVE 關(guān)鍵字, PostgreSQL 假設(shè)用戶試圖使用 的特性,
因而返回此錯誤.
描述
FETCH允許用戶使用游標(biāo)檢索行.所要檢索的行數(shù)用 # 聲明.如果游標(biāo)中剩下的行小于
#, 那么只有那些可用的抓過來.用關(guān)鍵字 ALL 代替數(shù)字將導(dǎo)致游標(biāo)中所有剩余行被
抓過來. 記錄可以 FORWARD (向前)抓,也可以 BACKWARD (向后)抓.缺省的方向
是 FORWARD (向前).
注意: 可以用負(fù)數(shù)作為行記數(shù), 符號等效于顛倒抓取方向關(guān)鍵字(FORWARD 和
BACKWARD).例如, FORWARD -1 等效于 BACKWARD 1.
注意
注意 FORWARD 和 BACKWARD 關(guān)鍵字是 PostgreSQL 擴(kuò)展. 語法也支持,在此命令的第
二種形式中聲明. 詳細(xì)的兼容性 SQL92 信息見下面.
在游標(biāo)中更新數(shù)據(jù)還不被 PostgreSQL, 支持,因?yàn)閷⒂螛?biāo)更新影射回基本表是不太可
能的,這一點(diǎn)對 VIEW 更新也一樣.因而用戶必須顯式的使用 UPDATE 命令來更新數(shù)
據(jù).
游標(biāo)只能用于事務(wù)內(nèi)部,因?yàn)樗鼈兇鎯Φ臄?shù)據(jù)跨越了多個用戶的查詢.
使用 MOVE語句改變游標(biāo)位置.使用 DECLARE語句定義一個游標(biāo).使用 BEGIN,
COMMIT, 和 ROLLBACK語句獲取更多關(guān)于事務(wù)的信息.
用法
下面的例子用一個游標(biāo)跨過一個表。
-- 建立一個游標(biāo):

BEGIN WORK;
DECLARE liahona CURSOR FOR SELECT * FROM films;

-- 抓取頭 5 行到游標(biāo) liahona 里:
FETCH FORWARD 5 IN liahona;

code |????????? title????????? | did | date_prod | kind??? | len
-------+-------------------------+-----+------------+----------+-------
BL101 | The Third Man?????????? | 101 | 1949-12-23 | Drama??? | 01:44
BL102 | The African Queen?????? | 101 | 1951-08-11 | Romantic | 01:43
JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romantic | 01:25
P_301 | Vertigo???????????????? | 103 | 1958-11-14 | Action?? | 02:08
P_302 | Becket????????????????? | 103 | 1964-02-03 | Drama??? | 02:28

-- 抓取前面行:
FETCH BACKWARD 1 IN liahona;

code | title?? | did | date_prod | kind?? | len
-------+---------+-----+------------+--------+-------
P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08

-- 關(guān)閉游標(biāo)并提交事務(wù):

CLOSE liahona;
COMMIT WORK;
兼容性 SQL92

注意: 非嵌入式游標(biāo)的使用是 PostgreSQL 擴(kuò)展.游標(biāo)的語法和用途與定義與 里定義
的嵌入式用法相似。
允許游標(biāo)在 FETCH 中的絕對定位, 并且允許將結(jié)果放在明確的變量里:
FETCH ABSOLUTE #
FROM cursor
INTO :variable [, ...]

ABSOLUTE
游標(biāo)將放置在寫明的絕對的行數(shù)的位置上.在 PostgreSQL 中所有的行數(shù)都是相對數(shù)
量,所以這一功能不支持.
:variable
目標(biāo)宿主變量.

----------------------------------------------------------------------------
----

GRANT
Name
GRANT? --? 定義訪問權(quán)限
Synopsis
GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] objectname [, ...]??? TO { username | GROUP groupname |
PUBLIC } [, ...]
描述
GRANT命令將某對象(表,視圖,序列) 上的特定權(quán)限給予一個用戶或者多個用戶或者一
組用戶.這些權(quán)限將增加到那些已經(jīng)賦予的權(quán)限上,如果存在這些權(quán)限的話.
鍵字 PUBLIC 表示該權(quán)限要賦予所有用戶, 包括那些以后可能創(chuàng)建的用戶.PUBLIC 可
以看做是一個隱含定義好的組,它總是包括所有用戶.請注意,任何特定的用戶都將擁
有直接賦予他/她的權(quán)限,加上 他/她所處的任何組,以及再加上賦予 PUBLIC 的權(quán)限
的總和.
在創(chuàng)建完對象之后,除了對象的創(chuàng)建者之外, 其它用戶沒有任何訪問該對象的權(quán)限,
除非創(chuàng)建者賦予某些權(quán)限. 對對象的創(chuàng)建者而言,沒有什么權(quán)限需要賦予,因?yàn)閯?chuàng)建
者自動持有所有權(quán)限.(不過,創(chuàng)建者出于安全考慮可以選擇 廢棄一些他自己的權(quán)
限.請注意賦予和廢止權(quán)限的能力是創(chuàng)建者與生具來的,并且不會丟失.刪除對象的權(quán)
利也是創(chuàng)建者固有的,并且不能賦予或 撤銷.)
可能的權(quán)限有∶
SELECT
允許對聲明的表,試圖,或者序列 SELECT 仁義字段.還允許做 COPY 的源.
INSERT
允許向聲明的表 INSERT 一個新行. 同時還允許做 COPY 的目標(biāo).
UPDATE
允許對聲明的表中任意字段做 UPDATE . SELECT ... FOR UPDATE 也要求這個權(quán)限
(除了 SELECT 權(quán)限之外).比如, 這個權(quán)限允許使用nextval, currval 和 setval.

DELETE
允許從聲明的表中 DELETE 行.
RULE
允許在該表/視圖上創(chuàng)建規(guī)則.(參閱 CREATE RULE 語句.)
REFERENCES
要在一個表上創(chuàng)建一個外鍵約束,你必須在帶參考健字的表上 擁有這個權(quán)限.
TRIGGER
允許在聲明表上創(chuàng)建觸發(fā)器.(參閱 CREATE TRIGGER 語句.)
ALL PRIVILEGES
把上面所有權(quán)限都一次賦予.PRIVILEGES 關(guān)鍵字在 PostgreSQL 里是可選的, 但是嚴(yán)
格的 SQL 要求有這個關(guān)鍵字.
其它命令要求的權(quán)限都在相應(yīng)的命令的參考頁上列出.
注意
我們要注意數(shù)據(jù)庫 superusers 可以訪問所有對象, 而不會受對象的權(quán)限設(shè)置影
響.這個特點(diǎn)類似 Unix 系統(tǒng)的 root 的權(quán)限.和 root 一樣,除了必要的情況,總是
以超級用戶 身分進(jìn)行操作是不明智的做法.
目前,要在 PostgreSQL 里只對某幾列 賦予權(quán)限,你必須創(chuàng)建一個擁有那幾行的視圖
然后給那個視圖賦予權(quán)限.
使用 psql的 /z 命令 獲取在現(xiàn)有對象上的與權(quán)限有關(guān)的信息.
Database??? = lusitania
+------------------+---------------------------------------------+
| Relation??????? |??????? Grant/Revoke Permissions???????????? |
+------------------+---------------------------------------------+
| mytable????????? | {"=rw","miriam=arwdRxt","group todos=rw"}?? |
+------------------+---------------------------------------------+
Legend:
uname=arwR -- privileges granted to a user
group gname=arwR -- privileges granted to a group
=arwR -- privileges granted to PUBLIC

r -- SELECT ("read")
w -- UPDATE ("write")
a -- INSERT ("append")
d -- DELETE
R -- RULE
x -- REFERENCES
t -- TRIGGER
arwdRxt -- ALL PRIVILEGES
用 REVOKE 命令刪除訪問權(quán)限.
例子
把表 films 的插入權(quán)限賦予所有用戶∶
GRANT INSERT ON films TO PUBLIC;
賦予用戶manuel對視圖kinds的所有權(quán)限∶
GRANT ALL PRIVILEGES ON kinds TO manuel;
兼容性 SQL92
在 ALL PRIVILEGES 里的 PRIVILEGES 關(guān)鍵字是必須的.SQL 不支持在一條命令里 對
多個表設(shè)置權(quán)限.
的 GRANT 語法允許在一個表里 為獨(dú)立的字段設(shè)置權(quán)限,并且允許設(shè)置一個權(quán)限用來
給其它人賦予同樣的權(quán)限∶
GRANT privilege [, ...]
ON object [ ( column [, ...] ) ] [, ...]
TO { PUBLIC | username [, ...]
} [ WITH GRANT OPTION ]
SQL 允許對其它類型的對象賦予 USAGE 權(quán)限∶CHARACTER SET,COLLATION,
TRANSLATION,DOMAIN.
TRIGGER 權(quán)限是 SQL99 引入的.RULE 權(quán)限是 PostgreSQL 擴(kuò)展.
又見
REVOKE

----------------------------------------------------------------------------
----

INSERT
Name
INSERT? --? 在表中創(chuàng)建新行
Synopsis
INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( expression [, ...] ) | SELECT query }
輸入
table
現(xiàn)存表的名稱.
column
表 table 中的列/字段名.
DEFAULT VALUES
所有字段都會用NULL或者創(chuàng)建表時用DEFAULT子句聲明的值填充.
expression
賦予 column 的一個有效表達(dá)式或值.
query
一個有效的查詢.請參考 SELECT 語句獲取有效參數(shù)的進(jìn)一步描述.
輸出
INSERT oid 1
如果只插入了一行,返回此信息. oid OID 是被插入行的數(shù)字標(biāo)識.
INSERT 0 #
如果插入了超過一行,返回此信息. # 是插入的行數(shù).
描述
INSERT允許我們向表中插入新行. 我們可以一次插入一行或多行作為查詢結(jié)果. 目標(biāo)
列表中的列/字段可以按任何順序排列.
在目標(biāo)列中沒有出現(xiàn)的列/字段將插入缺省值, 要么是定義了的 DEFAULT 值或者
NULL。 如果向定義為 NOT NULL 的列中插入 NULL 值, PostgreSQL 將拒絕新列。
如果每行的表達(dá)式不是正確的數(shù)據(jù)類型,將試圖進(jìn)行自動的類型轉(zhuǎn)換.
要想向表中插入數(shù)據(jù),你必須有插入權(quán)限, 同樣也要有選擇權(quán)限用于處理 WHERE 子句
里聲明的任何表。
用法
向表 films 里插入一行:
INSERT INTO films VALUES
('UA502','Bananas',105,'1971-07-13','Comedy',INTERVAL '82 minute');
在第二個例子里面省略了字段 len 因此在它里面將只存儲缺省的 NULL 值:
INSERT INTO films (code, title, did, date_prod, kind)
VALUES ('T_601', 'Yojimbo', 106, DATE '1961-06-16', 'Drama');

向表 distributors 里插入一行;注意只聲明了字段 name ,而沒有聲明的字段 did
將被賦于它的缺省值:
INSERT INTO distributors (name) VALUES ('British Lion');

從表 tmp 中插入幾行到表 films 中:
INSERT INTO films SELECT * FROM tmp;

插入數(shù)組(請參考 PostgreSQL 用戶手冊 獲取關(guān)于數(shù)組的更多信息):
-- 創(chuàng)建一個空的 3x3 游戲板來玩圈-和-叉游戲
-- (所有這些查詢創(chuàng)建相同的板屬性)
INSERT INTO tictactoe (game, board[1:3][1:3])
VALUES (1,'{{"","",""},{},{"",""}}');
INSERT INTO tictactoe (game, board[3][3])
VALUES (2,'{}');
INSERT INTO tictactoe (game, board)
VALUES (3,'{{,,},{,,},{,,}}');

兼容性 SQL92
INSERT語句與 完全兼容. 可能碰到的關(guān)于 query 子句特性的限制在 SELECT語句中有
相關(guān)文檔.

問題未解決?付費(fèi)解決問題加Q或微信 2589053300 (即Q號又微信號)右上方掃一掃可加博主微信

所寫所說,是心之所感,思之所悟,行之所得;文當(dāng)無敷衍,落筆求簡潔。 以所舍,求所獲;有所依,方所成!

支付寶贊助
微信贊助

免責(zé)聲明,若由于商用引起版權(quán)糾紛,一切責(zé)任均由使用者承擔(dān)。

您必須遵守我們的協(xié)議,如您下載該資源,行為將被視為對《免責(zé)聲明》全部內(nèi)容的認(rèn)可->聯(lián)系老梁投訴資源
LaoLiang.Net部分資源來自互聯(lián)網(wǎng)收集,僅供用于學(xué)習(xí)和交流,請勿用于商業(yè)用途。如有侵權(quán)、不妥之處,請聯(lián)系站長并出示版權(quán)證明以便刪除。 敬請諒解! 侵權(quán)刪帖/違法舉報/投稿等事物聯(lián)系郵箱:service@laoliang.net
意在交流學(xué)習(xí),歡迎贊賞評論,如有謬誤,請聯(lián)系指正;轉(zhuǎn)載請注明出處: » SQL常用命令集錦

發(fā)表回復(fù)

本站承接,網(wǎng)站推廣(SEM,SEO);軟件安裝與調(diào)試;服務(wù)器或網(wǎng)絡(luò)推薦及配置;APP開發(fā)與維護(hù);網(wǎng)站開發(fā)修改及維護(hù); 各財務(wù)軟件安裝調(diào)試及注冊服務(wù)(金蝶,用友,管家婆,速達(dá),星宇等);同時也有客戶管理系統(tǒng),人力資源,超市POS,醫(yī)藥管理等;

立即查看 了解詳情