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

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

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

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

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

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

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

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ù)庫(kù)超級(jí)用戶才能使用
這條命令。向組中增加用戶并不創(chuàng)建用戶。同樣從組中刪除用戶也不刪除用戶本身。
使用 CREATE GROUP創(chuàng)建新組以及 DROP GROUP刪除一個(gè)組。
用法
向組中增加用戶:
ALTER GROUP staff ADD USER Karl, john;
從組中刪除用戶:
ALTER GROUP workers DROP USER Beth;
兼容性 SQL92
里沒(méi)有 ALTER GROUP 語(yǔ)句。角色(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
如果一個(gè)列或表不存在返回的信息.
描述
ALTER TABLE變更一個(gè)現(xiàn)存表的定義.
ADD COLUMN形式使用與 CREATE TABLE一樣的語(yǔ)法向表中增加一個(gè)新列/字段。
ALTER COLUMN SET/DROP DEFAULT形式允許你從列/字段中設(shè)置或者刪除缺?。ㄖ担?br /> 注意缺?。ㄖ担┲贿m用于隨后的 INSERT 命令。 它們不會(huì)改變已經(jīng)存在于表中的行.
ALTER COLUMN SET STATISTICS形式允許你為 隨后的 ANALYZE 操作 設(shè)置收集統(tǒng)計(jì)信
息的對(duì)象.
RENAME 子句可以在不影響任何相關(guān)數(shù)據(jù)的情況下更改 一個(gè)表,字段,索引或者序列名
稱。因此, 在此命令執(zhí)行后數(shù)據(jù)仍將是相同尺寸和類型。
ADD table constraint definition子句使用與 CREATE TABLE一樣的語(yǔ)法向表中增加一
個(gè)新的約束。
DROP CONSTRAINT constraint子句刪除所有表上匹配 constraint 的 CHECK 約束(以及
其子表)
OWNER 把該表的所有者改為用戶 new user.
如果要改變表的綱要,你必須是表的所有者.
注意
COLUMN 關(guān)鍵字是多余的,可以省略.
在目前的 ADD COLUMN實(shí)現(xiàn)里還不支持 新列/字段的缺省(值)和 NOT NULL 子句。不
過(guò)你可以隨后用 ALTER TABLE 的 SET DEFAULT 形式設(shè)置缺?。ㄖ担?。(你可能還想用
UPDATE 把已存在行更新為缺省值。)
目前只有 CHECK 約束可以從表中刪除.RESTRICT 關(guān)鍵字是必須的,盡管 并不檢查依
賴性.還不支持 CASCADE 選項(xiàng).要?jiǎng)h除一個(gè) PRIMARY 或者 UNIQUE 約束,用 DROP
INDEX 命令刪除相關(guān)的索引. 要?jiǎng)h除 FOREIGN KEY 約束,你需要重新創(chuàng)建并重新裝載
該表, 創(chuàng)建的時(shí)候使用 CREATE TABLE命令的其它參數(shù).
比如,要?jiǎng)h除在表 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 用戶手冊(cè)里有關(guān)于繼承的更多信息.
請(qǐng)參考CREATE TABLE 部分獲取更多有效參數(shù)的描述.
用法
向表中增加一個(gè) varchar 列:
ALTER TABLE distributors ADD COLUMN address VARCHAR(30);
對(duì)現(xiàn)存列改名:
ALTER TABLE distributors RENAME COLUMN address TO city;
更改現(xiàn)存表的名字∶
ALTER TABLE distributors RENAME TO suppliers;
給一個(gè)表增加一個(gè)檢查約束∶
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) =
5);
刪除一個(gè)表和它的所有子表的監(jiān)查約束∶
ALTER TABLE distributors DROP CONSTRAINT zipchk;
向表中增加一個(gè)外鍵約束:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address)
REFERENCES addresses(address) MATCH FULL;
給表增加一個(gè)(多字段)唯一約束∶
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id,
zipcode);
兼容性 SQL92
ADD COLUMN 形式是兼容的,除了上面說(shuō)的缺?。ㄖ担┖?NOT NULL 約束外。 ALTER
COLUMN 形式是完全兼容的。
對(duì) ALTER TABLE 聲明了一些附加的 PostgreSQL 目前還不直接支持的功能:
ALTER TABLE table DROP [ COLUMN ] column { RESTRICT | CASCADE }

從一個(gè)表中刪除一個(gè)列. 目前,要?jiǎng)h除一個(gè)現(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 對(duì) 的擴(kuò)展。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

COMMENT
COMMENT
Name
COMMENT? --? 定義或者改變一個(gè)對(duì)象的評(píng)注
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
要加入評(píng)注的對(duì)象名稱.
text
要加入的評(píng)注.
輸出
COMMENT???? 成功對(duì)表評(píng)注后的返回.
描述
COMMENT存儲(chǔ)一個(gè)數(shù)據(jù)庫(kù)對(duì)象的評(píng)注, 這個(gè)評(píng)注可以很容易用 psql的 /dd或 /d+ 或者
/l+ 命令檢索出來(lái).其它檢索評(píng)注的用戶接口可以建設(shè)在 psql 所用地同樣地內(nèi)部函數(shù)
的基礎(chǔ)上,也就是 obj_description() 和 col_description().
要修改一個(gè)評(píng)注,為同一個(gè)對(duì)象發(fā)出一條新的 COMMENT 命令即可.每個(gè)對(duì)象只存儲(chǔ)一
條評(píng)注. 要?jiǎng)h除評(píng)注,在文本字串的位置寫(xiě)上 NULL.當(dāng)刪除對(duì)象時(shí),評(píng)注自動(dòng)被刪除
掉.
需要說(shuō)明的是目前評(píng)注沒(méi)有安全機(jī)制∶任何聯(lián)接到某數(shù)據(jù)庫(kù)上地用戶 都可以看到所有
該數(shù)據(jù)庫(kù)對(duì)象地評(píng)注(盡管只有超級(jí)用戶可以修改 不屬于它地對(duì)象的評(píng)注).因此,不
要在評(píng)注里放安全性敏感地信息.
用法
給表mytable 加評(píng)注:
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
里沒(méi)有COMMENT.

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

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

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

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

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

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

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

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

CREATE CONSTRAINT TRIGGER
CREATE CONSTRAINT TRIGGER
Name
CREATE CONSTRAINT TRIGGER? --? 定義一個(gè)新的約束觸發(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ā)器.
這條語(yǔ)句不是做一般用途用的.

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

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

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

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

在另一個(gè)地方 ~/private_db創(chuàng)建新數(shù)據(jù)庫(kù):
$ 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
在 里沒(méi)有 CREATE DATABASE 語(yǔ)句. 數(shù)據(jù)庫(kù)等同于目錄,其創(chuàng)建是由實(shí)現(xiàn)決定的.

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

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

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

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

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

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

這里 option 可以是∶

SYSID gid
| USER username [, ...]

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

里沒(méi)有 CREATE GROUP 。Roles 在概念上與組類似。

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

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

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

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

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

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

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

和操作符
MYBOXES.description === box '((0,0), (1,1))'
之間的區(qū)別是 PostgreSQL 試圖優(yōu)化操作符并且可以決定使用索引來(lái)縮小相關(guān)操作符的
搜索區(qū)間.但是,對(duì)函數(shù)將不會(huì)有任何優(yōu)化的動(dòng)作,而且是強(qiáng)制 執(zhí)行.最后,函數(shù)可
有任意個(gè)參數(shù),而操作符限于一個(gè)或兩個(gè).
注意
請(qǐng)參閱 PostgreSQL 用戶手冊(cè) 中操作符章節(jié)獲取更多信息.請(qǐng)使用 DROP OPERATOR 從
數(shù)據(jù)庫(kù)中刪除用戶定義操作符.
用法
下面命令定義一個(gè)新操作符,面積相等,用于 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ò)展. 在中沒(méi)有 CREATE OPERATOR 語(yǔ)句.

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

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

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

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

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

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

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

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

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

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

CREATE TRIGGER
Name
CREATE TRIGGER? --? 定義一個(gè)新的觸發(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
一個(gè)用戶提供的函數(shù).
輸出
CREATE
如果觸發(fā)器成功創(chuàng)建,返回此信息.
描述
CREATE TRIGGER將向現(xiàn)有數(shù)據(jù)庫(kù)中增加一個(gè)新的觸發(fā)器. 觸發(fā)器將與表 table 相聯(lián)并
且將執(zhí)行聲明的函數(shù) func.
觸發(fā)器可以聲明為在對(duì)記錄進(jìn)行操作之前 在檢查約束之前和 INSERT,UPDATE 或
DELETE 執(zhí)行前)或之后(在檢 查約束之后和完成 INSERT, UPDATE 或 DELETE 操
作)觸發(fā). 如果觸發(fā)器在事件之前,觸發(fā)器可能略過(guò)當(dāng)前記錄 的操作或改變被插入的
(當(dāng)前)記錄(只對(duì) INSERT 和 UPDATE 操作有效). 如果觸發(fā)器在事件之后,所有
更改,包括最后的插入, 更新或刪除對(duì)觸發(fā)器都是"可見(jiàn)"的.
SELECT并不更改任何行,因此你不能創(chuàng)建 SELECT 觸發(fā)器.這種場(chǎng)合下規(guī)則和視圖更合
適些.
請(qǐng)參考 PostgreSQL 程序員手冊(cè)中SPI 和觸發(fā)器章節(jié)獲取更多信息.
注意
CREATE TRIGGER是 PostgreSQL 語(yǔ)言擴(kuò)展.
只有表所有者可以就此表創(chuàng)建一個(gè)觸發(fā)器.
在當(dāng)前的版本,STATEMENT 觸發(fā)器還沒(méi)有實(shí)現(xiàn).
請(qǐng)參考 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');

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

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

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

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

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

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

描述
CREATE VIEW將定義一個(gè)表的視圖. 這個(gè)視圖不是物理上實(shí)際存在(于磁盤)的.具體
的說(shuō),自動(dòng)生成 一個(gè)改寫(xiě)索引規(guī)則的查詢用以支持在視圖上的檢索.
注意
目前,視圖是只讀的∶系統(tǒng)將不允許在視圖上插入,更新,或者刪除數(shù)據(jù).你可以通過(guò)
在視圖上創(chuàng)建把插入等動(dòng)作重寫(xiě)為向其它表做合適操作的規(guī)則來(lái) 實(shí)現(xiàn)可更新視圖的效
果.更多信息詳見(jiàn) CREATE RULE .
使用 DROP VIEW 語(yǔ)句刪除視圖.
用法
創(chuàng)建一個(gè)由所有 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
這個(gè)選項(xiàng)用于可更新視圖. 所有對(duì)視圖的 INSERT 和 UPDATE 都要經(jīng)過(guò)視圖定義條件
的校驗(yàn). 如果 沒(méi)有通過(guò)校驗(yàn),更新將被拒絕.
LOCAL
對(duì)這個(gè)視圖進(jìn)行完整性檢查.
CASCADE
對(duì)此視圖和任何相關(guān)視圖進(jìn)行完整性檢查. 在既沒(méi)有聲明 CASCADE 也沒(méi)有聲明 LOCAL
時(shí),假設(shè)為 CASCADE.

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

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

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

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

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

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

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

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

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

DROP DATABASE是一個(gè) PostgreSQL 語(yǔ)言的擴(kuò)展. 在 中沒(méi)有這條命令.

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

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

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

DROP GROUP
DROP GROUP
Name
DROP GROUP? --? 刪除一個(gè)用戶組
Synopsis
DROP GROUP name

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

里沒(méi)有 DROP GROUP.

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

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

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

DROP LANGUAGE
DROP LANGUAGE
Name
DROP LANGUAGE? --? 刪除一個(gè)用戶定義的過(guò)程語(yǔ)言
Synopsis
DROP [ PROCEDURAL ] LANGUAGE 'name'

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

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

DROP OPERATOR
DROP OPERATOR
Name
DROP OPERATOR? --? 刪除一個(gè)用戶定義操作符
Synopsis
DROP OPERATOR id ( lefttype | NONE , righttype | NONE )
輸入
id
一個(gè)現(xiàn)存的操作符的標(biāo)識(shí)符.
lefttype
該操作符左參數(shù)的類型.如果該操作符沒(méi)有左參數(shù), 寫(xiě) NONE.
righttype
該操作符右參數(shù)的類型.如果該操作符沒(méi)有右參數(shù), 寫(xiě) 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語(yǔ)句從數(shù)據(jù)庫(kù)中刪除一個(gè)現(xiàn)存的操作符. 要執(zhí)行這個(gè)命令,你必須是操
作符所有者.
左目操作符的右類型或右目操作符的左類型可以聲明為 NONE.
注意
DROP OPERATOR語(yǔ)句是 PostgreSQL 語(yǔ)言擴(kuò)展.
請(qǐng)參考 CREATE OPERATOR獲取如何創(chuàng)建操作符的信息.
刪除任何依賴于被刪除的操作符的訪問(wèn)模式和操作符表是用戶的責(zé)任.
用法
將用于int4的冪操作符 a^n 刪除:
DROP OPERATOR ^ (int4, int4);
刪除用于boolean變量的左目取反操作符(! b):
DROP OPERATOR ! (none, bool);
刪除用于 int4的階乘 (! i) : int4:
DROP OPERATOR ! (int4, none);
兼容性 SQL92
在里沒(méi)有 DROP OPERATOR 語(yǔ)句.

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

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

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

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

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

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

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

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

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

DROP TRIGGER
DROP TRIGGER
Name
DROP TRIGGER? --? 刪除一個(gè)觸發(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將刪除所有對(duì)一個(gè)現(xiàn)存觸發(fā)器的引用. 要執(zhí)行這個(gè)命令,當(dāng)前用戶必須
是觸發(fā)器的所有者.
注意
DROP TRIGGER是 PostgreSQL 語(yǔ)言的擴(kuò)展.
請(qǐng)參考 CREATE TRIGGER 獲取如何創(chuàng)建觸發(fā)器的信息.
用法
刪除表films的if_dist_exists觸發(fā)器:
DROP TRIGGER if_dist_exists ON films;
兼容性 SQL92
在里沒(méi)有DROP TRIGGER.

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

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

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

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

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

DROP VIEW
DROP VIEW
Name
DROP VIEW? --? 刪除一個(gè)視圖
Synopsis
DROP VIEW name [, ...] 輸入
name
現(xiàn)存視圖名稱.
輸出
DROP
命令成功執(zhí)行的返回.
ERROR: view name does not exist
如果聲明的視圖在數(shù)據(jù)庫(kù)中不存在,返回此信息.
描述
DROP VIEW從數(shù)據(jù)庫(kù)中刪除一個(gè)現(xiàn)存的視圖. 執(zhí)行這條命令必須是視圖的所有者.
注意
請(qǐng)參考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ù)庫(kù)中刪除一個(gè)視圖, 你必須明確地將其刪除.

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

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

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

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

在 中沒(méi)有EXPLAIN 語(yǔ)句.

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

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

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

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

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

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

DELETE
允許從聲明的表中 DELETE 行.
RULE
允許在該表/視圖上創(chuàng)建規(guī)則.(參閱 CREATE RULE 語(yǔ)句.)
REFERENCES
要在一個(gè)表上創(chuàng)建一個(gè)外鍵約束,你必須在帶參考健字的表上 擁有這個(gè)權(quán)限.
TRIGGER
允許在聲明表上創(chuàng)建觸發(fā)器.(參閱 CREATE TRIGGER 語(yǔ)句.)
ALL PRIVILEGES
把上面所有權(quán)限都一次賦予.PRIVILEGES 關(guān)鍵字在 PostgreSQL 里是可選的, 但是嚴(yán)
格的 SQL 要求有這個(gè)關(guān)鍵字.
其它命令要求的權(quán)限都在相應(yīng)的命令的參考頁(yè)上列出.
注意
我們要注意數(shù)據(jù)庫(kù) superusers 可以訪問(wèn)所有對(duì)象, 而不會(huì)受對(duì)象的權(quán)限設(shè)置影
響.這個(gè)特點(diǎn)類似 Unix 系統(tǒng)的 root 的權(quán)限.和 root 一樣,除了必要的情況,總是
以超級(jí)用戶 身分進(jìn)行操作是不明智的做法.
目前,要在 PostgreSQL 里只對(duì)某幾列 賦予權(quán)限,你必須創(chuàng)建一個(gè)擁有那幾行的視圖
然后給那個(gè)視圖賦予權(quán)限.
使用 psql的 /z 命令 獲取在現(xiàn)有對(duì)象上的與權(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 命令刪除訪問(wèn)權(quán)限.
例子
把表 films 的插入權(quán)限賦予所有用戶∶
GRANT INSERT ON films TO PUBLIC;
賦予用戶manuel對(duì)視圖kinds的所有權(quán)限∶
GRANT ALL PRIVILEGES ON kinds TO manuel;
兼容性 SQL92
在 ALL PRIVILEGES 里的 PRIVILEGES 關(guān)鍵字是必須的.SQL 不支持在一條命令里 對(duì)
多個(gè)表設(shè)置權(quán)限.
的 GRANT 語(yǔ)法允許在一個(gè)表里 為獨(dú)立的字段設(shè)置權(quán)限,并且允許設(shè)置一個(gè)權(quán)限用來(lái)
給其它人賦予同樣的權(quán)限∶
GRANT privilege [, ...]
ON object [ ( column [, ...] ) ] [, ...]
TO { PUBLIC | username [, ...]
} [ WITH GRANT OPTION ]
SQL 允許對(duì)其它類型的對(duì)象賦予 USAGE 權(quán)限∶CHARACTER SET,COLLATION,
TRANSLATION,DOMAIN.
TRIGGER 權(quán)限是 SQL99 引入的.RULE 權(quán)限是 PostgreSQL 擴(kuò)展.
又見(jiàn)
REVOKE

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

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

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

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

插入數(shù)組(請(qǐng)參考 PostgreSQL 用戶手冊(cè) 獲取關(guān)于數(shù)組的更多信息):
-- 創(chuàng)建一個(gè)空的 3x3 游戲板來(lái)玩圈-和-叉游戲
-- (所有這些查詢創(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語(yǔ)句與 完全兼容. 可能碰到的關(guān)于 query 子句特性的限制在 SELECT語(yǔ)句中有
相關(guān)文檔.

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

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

支付寶贊助
微信贊助

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

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

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

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

立即查看 了解詳情