国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

SQL大全[1]

2024-07-21 02:44:49
字體:
供稿:網(wǎng)友
SQL 命令
這部分包含那些 PostgreSQL 支持的 SQL 命令的信息.這里的 "SQL" 就是該語言通常的含義; 每條命令的與標(biāo)準(zhǔn)有關(guān)的兼容性的信息可以在相關(guān)的參考頁中找到.
Table of Contents
ABORT --  退出當(dāng)前事務(wù)
ALTER GROUP --  向組中增加用戶或從組中刪除用戶  
ALTER USER --  改變數(shù)據(jù)庫用戶帳號.
ANALYZE --  收集與數(shù)據(jù)庫有關(guān)的統(tǒng)計(jì)
BEGIN --  開始一個(gè)事務(wù)塊
CHECKPOINT -- 強(qiáng)制一個(gè)事務(wù)日志檢查點(diǎn)
CLOSE --  關(guān)閉一個(gè)游標(biāo)
CLUSTER --  根據(jù)一個(gè)索引對某個(gè)表集簇
COMMENT --  定義或者改變一個(gè)對象的評注
COMMIT --  提交當(dāng)前事務(wù)
COPY --  在表和文件之間拷貝數(shù)據(jù)
CREATE AGGREGATE --  定義一個(gè)新的聚集函數(shù)
CREATE CONSTRAINT TRIGGER --  定義一個(gè)新的約束觸發(fā)器
CREATE DATABASE --  創(chuàng)建新數(shù)據(jù)庫
CREATE FUNCTION --  定義一個(gè)新函數(shù)
CREATE GROUP --  定義一個(gè)新的用戶組
CREATE INDEX --  定義一個(gè)新索引
CREATE LANGUAGE -- 定義一種新的過程語言
CREATE OperaTOR --  定義一個(gè)新的操作符
CREATE RULE --  定義一個(gè)新的重寫規(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ù)庫用戶帳戶
CREATE VIEW --  定義一個(gè)視圖
DECLARE --  定義一個(gè)游標(biāo)
DELETE --  刪除一個(gè)表中的行
DROP AGGREGATE --  刪除一個(gè)用戶定義的聚集函數(shù)
DROP DATABASE --  刪除一個(gè)數(shù)據(jù)庫.
DROP FUNCTION --  刪除一個(gè)用戶定義的函數(shù)
DROP GROUP --  刪除一個(gè)用戶組
DROP INDEX --  刪除一個(gè)索引
DROP LANGUAGE --  刪除一個(gè)用戶定義的過程語言
DROP OPERATOR --  刪除一個(gè)用戶定義操作符
DROP RULE --  刪除一個(gè)重寫規(guī)則
DROP SEQUENCE --  刪除一個(gè)序列
DROP TABLE --  刪除一個(gè)表
DROP TRIGGER --  刪除一個(gè)觸發(fā)器定義.
DROP TYPE --  刪除一個(gè)用戶定義數(shù)據(jù)類型
DROP USER --  刪除一個(gè)數(shù)據(jù)庫用戶帳號
DROP VIEW --  刪除一個(gè)視圖
END --  提交當(dāng)前的事務(wù)
EXPLAIN --  顯示語句執(zhí)行規(guī)劃
FETCH --  用游標(biāo)從表中抓取行
GRANT --  定義訪問權(quán)限
INSERT --  在表中創(chuàng)建新行
LISTEN --  監(jiān)聽一個(gè)通知
LOAD -- 裝載或重載一個(gè)共享庫文件
LOCK --  明確地鎖定一個(gè)表
MOVE --  把游標(biāo)放到表中的特定的行
NOTIFY --  生成一個(gè)通知
REINDEX --  恢復(fù)一個(gè)損壞了的索引
RESET -- 把一個(gè)運(yùn)行時(shí)參數(shù)值恢復(fù)為缺省值
REVOKE --  刪除訪問權(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)前會話設(shè)置會話用戶標(biāo)識符和當(dāng)前用戶標(biāo)識符
SET TRANSACTION -- 設(shè)置當(dāng)前事務(wù)的特性
SHOW -- 顯示運(yùn)行時(shí)參數(shù)的數(shù)值
TRUNCATE --  清空一個(gè)表
UNLISTEN --  停止監(jiān)聽通知信息
UPDATE --  更新一個(gè)表中的行
VACUUM --  垃圾收集以及可選地分析一個(gè)數(shù)據(jù)庫

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

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

輸出
ROLLBACK         成功的返回信息.
NOTICE: ROLLBACK: no transaction in PRogress
如果當(dāng)前沒有任何正在處理的事務(wù)存在.
描述
ABORT回卷當(dāng)前事務(wù)并且廢棄所有當(dāng)前事務(wù)中做的更新. 這個(gè)命令和 命令 ROLLBACK 完全一樣, 只是由于歷史原因而保留下來.
注意
用COMMIT語句可以成功地結(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ù)庫超級用戶才能使用這條命令。向組中增加用戶并不創(chuàng)建用戶。同樣從組中刪除用戶也不刪除用戶本身。
使用 CREATE GROUP創(chuàng)建新組以及 DROP GROUP刪除一個(gè)組。
用法
向組中增加用戶:
ALTER GROUP staff ADD USER Karl, john;
從組中刪除用戶:
ALTER GROUP workers DROP USER Beth;
兼容性 SQL92   
里沒有 ALTER GROUP 語句。角色(roles)的概念與之類似。

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

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

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

輸入
table
試圖更改的現(xiàn)存表的名稱.
column
現(xiàn)存或新的列名稱.
type
新列的類型.
newcolumn
現(xiàn)存列的新名稱.
new table
表的新名稱.
table constraint definition
表的新的約束定義.
New user
該表的新所有者的用戶名.
輸出
ALTER
從被改名的列或表返回的信息.
ERROR
如果一個(gè)列或表不存在返回的信息.
描述
ALTER TABLE變更一個(gè)現(xiàn)存表的定義.
ADD COLUMN形式使用與 CREATE TABLE一樣的語法向表中增加一個(gè)新列/字段。
ALTER COLUMN SET/DROP DEFAULT形式允許你從列/字段中設(shè)置或者刪除缺省(值)。 注意缺省(值)只適用于隨后的 INSERT 命令。 它們不會改變已經(jīng)存在于表中的行.
ALTER COLUMN SET STATISTICS形式允許你為 隨后的 ANALYZE 操作 設(shè)置收集統(tǒng)計(jì)信息的對象.
RENAME 子句可以在不影響任何相關(guān)數(shù)據(jù)的情況下更改 一個(gè)表,字段,索引或者序列名稱。因此, 在此命令執(zhí)行后數(shù)據(jù)仍將是相同尺寸和類型。
ADD table constraint definition子句使用與 CREATE TABLE一樣的語法向表中增加一個(gè)新的約束。
DROP CONSTRAINT constraint子句刪除所有表上匹配 constraint 的 CHECK 約束(以及其子表)
OWNER 把該表的所有者改為用戶 new user.
如果要改變表的綱要,你必須是表的所有者.
注意
COLUMN 關(guān)鍵字是多余的,可以省略.
在目前的 ADD COLUMN實(shí)現(xiàn)里還不支持 新列/字段的缺省(值)和 NOT NULL 子句。不過你可以隨后用 ALTER TABLE 的 SET DEFAULT 形式設(shè)置缺省(值)。(你可能還想用 UPDATE 把已存在行更新為缺省值。)
目前只有 CHECK 約束可以從表中刪除.RESTRICT 關(guān)鍵字是必須的,盡管 并不檢查依賴性.還不支持 CASCADE 選項(xiàng).要?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 用戶手冊里有關(guān)于繼承的更多信息.
請參考CREATE TABLE 部分獲取更多有效參數(shù)的描述.
用法
向表中增加一個(gè) varchar 列:
ALTER TABLE distributors ADD COLUMN address VARCHAR(30);   
對現(xiàn)存列改名:
ALTER TABLE distributors RENAME COLUMN address TO city;   
更改現(xiàn)存表的名字∶
ALTER TABLE distributors RENAME TO suppliers;   
給一個(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 形式是兼容的,除了上面說的缺省(值)和 NOT NULL 約束外。 ALTER COLUMN 形式是完全兼容的。
對 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 對 的擴(kuò)展。

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

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

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

ANALYZE
ANALYZE
Name
ANALYZE  --  收集與數(shù)據(jù)庫有關(guān)的統(tǒng)計(jì)
Synopsis
ANALYZE [ VERBOSE ] [ table [ (column [, ...] ) ] ]
輸入
VERBOSE
打開處理過程信息的顯示.
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ī)劃.
如果沒有參數(shù),ANALYZE 檢查在當(dāng)前數(shù)據(jù)庫里的所有 表.如果有參數(shù),ANALYZE 只檢查那個(gè)表. 你還可以給出一列字段名字,這個(gè)時(shí)候只有那些字段的統(tǒng)計(jì)信息被更新.
注意
周期性地運(yùn)行 ANALYZE,或者在對表的 大部分內(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)行.
對于大表,ANALYZE 采集表內(nèi)容的一個(gè)隨機(jī)的抽樣做 統(tǒng)計(jì),而不是檢查每一行.這樣即使是很大的表,我們也只需要很少的一些時(shí)間就可以完成分析.不過要注意的是統(tǒng)計(jì)只是近似的結(jié)果,而且每次運(yùn)行ANALYZE都會有一些小變化,即使表內(nèi)容實(shí)際上 沒有改變也這樣.這樣會導(dǎo)致 EXPLAIN 所顯示的 規(guī)劃器計(jì)算的開銷有一些小變化,
收集的統(tǒng)計(jì)信息通常包括一個(gè)每字段最常用數(shù)值的列表以及一個(gè)包線圖,顯示每個(gè)字段里數(shù)據(jù)的近似分布.如果 ANALYZE 認(rèn)為它們都沒有什么用, (比如,在一個(gè)唯一鍵字的字段上沒有公共的數(shù)值) 或者是該字段數(shù)據(jù)類型不支持相關(guān)的操作符,那么它們都可以忽略.在用戶手冊 中有關(guān)于統(tǒng)計(jì)的更多信息.
分析的廣度可以通過用 ALTER TABLE ALTER COLUMN SET STATISTICS (參閱 ALTER TABLE調(diào)整每字段的統(tǒng)計(jì)目標(biāo)來控制.目標(biāo)數(shù)值設(shè)置最常用數(shù)值列表中的記錄的最大數(shù)目以及包線圖中的最大塊數(shù).缺省的目標(biāo)數(shù)值是 10,不過我們可以調(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ì)收集. 對那些從來不參與到查詢的 WHERE,GROUP BY,或者 ORDER BY 子句里的字段 是很有用的,因?yàn)橐?guī)劃器不會使用到這樣的字段上的統(tǒng)計(jì). )
在被分析的字段中最大的統(tǒng)計(jì)目標(biāo)決定為統(tǒng)計(jì)采樣的表中的行的數(shù)目. 增大目標(biāo)會導(dǎo)致做 ANALYZE 的時(shí)候成比例地 增大對時(shí)間和空間的需求.
兼容性 SQL92   
里沒有 ANALYZE 語句.

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

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

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

CLUSTER
Name
CLUSTER  --  根據(jù)一個(gè)索引對某個(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 的度量對表 table 進(jìn)行存儲建簇. 索引必須已經(jīng)在表 table name. 上定義了.
當(dāng)對一個(gè)表建簇后,該表的物理存儲將基于索引信息進(jìn)行. 建簇是靜態(tài)的,也就是說,當(dāng)表被更新后,改變的內(nèi)容不會建簇. 不會試圖對更新過的記錄重新建簇.如果需要,可以通過手工執(zhí)行該命令的方法重建簇.
注意
該表實(shí)際上按索引順序拷貝到了一個(gè)臨時(shí)表中,然后重新改成原名. 因此,在建簇時(shí)所有賦予的權(quán)限和其它索引都將丟失.
如果你只是隨機(jī)的訪問表中的行, 那么在堆表中的數(shù)據(jù)的實(shí)際存儲順序是無關(guān)緊要的. 但是,如果你對某些數(shù)據(jù)的訪問多于其他數(shù)據(jù),而且有一個(gè)索引將這些數(shù)據(jù)分組,那你就將從 使用 CLUSTER 中獲益.
另一個(gè)CLUSTER 很有幫助的例子是當(dāng)你用索引從一個(gè)表中取出幾個(gè)記錄時(shí). 如果你從一個(gè)表中請求一定索引范圍的值,或者是一個(gè)索引過的值對應(yīng)多行, CLUSTER 也會有助于應(yīng)用,因?yàn)槿绻饕龢?biāo)識出第一匹配行所在的堆存儲頁,所有 其他行也可能已經(jīng)在同一堆存儲頁里了,這樣便節(jié)省了磁盤訪問的時(shí)間,加速了查詢.
有兩種建簇的數(shù)據(jù).第一種是用 CLUSTER 命令,此命令將原表按你聲明的索引重新排列.這個(gè)動(dòng)作在操作大表時(shí)可能會很慢,因?yàn)槊恳恍卸紡亩汛鎯摾锇此饕樞蛉〕觯绻鎯摫頉]有排序,整個(gè)表是隨機(jī)存放在各個(gè)頁面的,因而每行都要進(jìn)行依次磁盤頁面操作. PostgreSQL 有一個(gè)緩沖, 但一個(gè)大表的主體是不可能都放到緩沖去的.
另一個(gè)對數(shù)據(jù)建簇的方法是使用
SELECT column list INTO TABLE new table
     FROM table ORDER BY column list
    
這個(gè)用法使用PostgreSQL 排序的代碼 ORDER BY 來匹配索引,在對未排序的數(shù)據(jù)操作時(shí)速度快得多. 然后你可以刪除舊表,用 ALTER TABLE...RENAME將 new table 改成舊表名, 并且重建該表所有索引.唯一的問題是 OID 將不保留.這時(shí)再做 CLUSTER 將快得多, 因?yàn)榇蠖鄶?shù)堆棧數(shù)據(jù)已經(jīng)排過序了而且使用現(xiàn)有的索引.
用法
以雇員的薪水屬性對雇員關(guān)系建簇.
CLUSTER emp_ind ON emp;
兼容性 SQL92   
在 規(guī)范里沒有 CLUSTER 語句.

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

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

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

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

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

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

數(shù)據(jù)域是 NULL.沒有數(shù)據(jù)跟著.
> 0
數(shù)據(jù)域是定長數(shù)據(jù)類型.和類型長字相同的準(zhǔn)確的 N 字節(jié).
-1
數(shù)據(jù)域是變長的數(shù)據(jù)類型.下面四個(gè)字節(jié)是變長頭, 它包含包括其自身在內(nèi)的所有值長度.
< -1
保留為將來使用.
對于非 NULL 域,讀者可以檢查這個(gè)類型長度是否匹配目標(biāo)列的長度.這樣就提供了一種簡單但有用的檢查,核實(shí)該數(shù)據(jù)是否預(yù)期數(shù)據(jù).
在數(shù)據(jù)域之間沒有對奇填充或者任何其它額外的數(shù)據(jù).還要注意該格式并不區(qū)分一種數(shù)據(jù)類型是傳值還是傳參.這些東西都是非常有意的:它們可能可以提高這些文件的移植性(盡管位權(quán)重和浮點(diǎn)格式等問題可能仍然不能讓你進(jìn)行跨機(jī)器移動(dòng)二進(jìn)制數(shù)據(jù)).
如果在傾倒中包括了 OID,那么該 OID 域立即跟在域計(jì)數(shù)字后面.它是一個(gè)普通的域,只不過它沒有包括在域計(jì)數(shù).但它包括類型長度 --- 這樣就允許我們不用花太多的勁就可以處理 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ò).這樣就提供了對丟失與數(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/. 請注意在這里每行里的空白實(shí)際上是一個(gè) TAB.
下面的是同樣的數(shù)據(jù),在一臺 linux/i586 機(jī)器上以二進(jìn)制形式輸出.這些數(shù)據(jù)是用 Unix 工具 od -c 過濾之后輸出的.該表有三個(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   在里沒有 COPY 語句.

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

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ù)類型. 對于不檢查輸入類型的聚集來說,這個(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. 另外,對于一個(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ù)的返回類型.如果沒有聲明 ffunc 則使用聚集結(jié)果的狀態(tài)值作為聚集的結(jié)果,而輸出類型為 state_type.
initial_condition
狀態(tài)值的初始設(shè)置(值).它必須是一個(gè)數(shù)據(jù)類型 state_type 可以接受的文本常量值. 如果沒有聲明,狀態(tài)值初始為 NULL.
輸出
CREATE
命令執(zhí)行成功的返回信息.
描述
CREATE AGGREGATE允許用戶或程序員通過定義新的聚集函數(shù)來擴(kuò)展 PostgreSQL 的功能.一些用于基本類型的聚集函數(shù)如 min(integer) 和 avg(double precision) 等已經(jīng)包含在基礎(chǔ)軟件包里了.如果你需要定義一個(gè)新類型或需要一個(gè)還沒有提供的聚集函數(shù),這時(shí)便可用 CREATE AGGREGATE 來提供我們所需要的特性.
一個(gè)聚集函數(shù)是用它的名字和輸入數(shù)據(jù)類型來標(biāo)識的. 如果兩個(gè)聚集的輸入數(shù)據(jù)不同,它們可以有相同的名字.要避免沖突, 不要寫一個(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). 對于每個(gè)輸入數(shù)據(jù)條目,都調(diào)用狀態(tài)轉(zhuǎn)換函數(shù)計(jì)算內(nèi)部狀態(tài)值的新數(shù)值.在處理完所有數(shù)據(jù)后,調(diào)用一次最終處理函數(shù)以計(jì)算聚集的輸出值.如果沒有最終處理函數(shù),那么將最后的狀態(tài)值當(dāng)做返回值.
一個(gè)聚集函數(shù)還可能提供一個(gè)初始條件,也就是說, 所用的該內(nèi)部狀態(tài)值的初始值.這個(gè)值是作為類型 text 的數(shù)據(jù)域存儲在數(shù)據(jù)庫里的, 不過它們必須是狀態(tài)值數(shù)據(jù)類型的合法的外部表現(xiàn)形式的常量. 如果沒有提供狀態(tài),那么狀態(tài)值初始化為 NULL.
如果在 pg_proc 里該狀態(tài)轉(zhuǎn)換函數(shù)被定義為 "strict", 那么 NULL 輸入就不能調(diào)用它.這個(gè)時(shí)候,帶有這樣的轉(zhuǎn)換函數(shù)的聚集執(zhí)行起來的現(xiàn)象如下所述.NULL 輸入的值被忽略(不調(diào)用此函數(shù)并且保留前一個(gè)狀態(tài)值).如果初始狀態(tài)值是 NULL,那么由第一個(gè)非 NULL 值替換該狀態(tài)值, 而狀態(tài)轉(zhuǎn)換函數(shù)從第二個(gè)非 NULL 的輸入值開始調(diào)用.這樣做讓我們比較容易 實(shí)現(xiàn)象 max 這樣的聚集.請注意這種行為只是當(dāng) state_type 與 input_data_type 相同的時(shí)候才表現(xiàn)出來. 如果這些類型不同,你必須提供一個(gè)非 NULL 的初始條件或者使用一個(gè)非strice的狀態(tài)轉(zhuǎn)換函數(shù).
如果狀態(tài)轉(zhuǎn)換函數(shù)不是 strict(嚴(yán)格)的, 那么它將無條件地為每個(gè)輸入值調(diào)用,并且必須自行處理 NULL 輸入和 NULL 轉(zhuǎn)換值, 這樣就允許聚集的作者對聚集中的 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í)就會返回 NULL.
注意
使用 DROP AGGREGATE 刪除聚集函數(shù).
CREATE AGGREGATE的參數(shù)可以以任何順序書寫,而不只是上面顯示的順序.
用法
請參考 PostgreSQL 程序員手冊 聚集函數(shù)章節(jié)的聚集函數(shù)部分獲取完整的例子.
兼容性 SQL92   
CREATE AGGREGATE是 PostgreSQL 語言的擴(kuò)展. 在 里沒有 CREATE AGGREGATE.

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

CREATE CONSTRAINT TRIGGER
CREATE CONSTRAINT TRIGGER
Name
CREATE CONSTRAINT TRIGGER  --  定義一個(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ā)器.
這條語句不是做一般用途用的.

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

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

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

initlocation is complete.
$ psql olly
Welcome to psql, the PostgreSQL interactive terminal.

Type: /copyright for distribution terms
       /h for help with SQL commands
       /? for help on internal slash commands
       /g or terminate with semicolon to execute query
       /q to quit
olly=> CREATE DATABASE elsewhere WITH LOCATION = '/home/olly/private_db';
CREATE DATABASE
兼容性 SQL92   
在 里沒有 CREATE DATABASE 語句. 數(shù)據(jù)庫等同于目錄,其創(chuàng)建是由實(shí)現(xiàn)決定的.

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

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

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

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

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

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

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

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

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

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

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

CREATE OPERATOR
CREATE OPERATOR
Name
CREATE OPERATOR  --  定義一個(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
要定義的操作符。可用的字符見下文。
func_name
用于實(shí)現(xiàn)該操作符的函數(shù)。
lefttype
如果存在的話,操作符左手邊的參數(shù)類型. 如果是左目操作符,這個(gè)參數(shù)可以省略。
righttype
如果存在的話,操作符右手邊的參數(shù)類型. 如果是右目操作符,這個(gè)參數(shù)可以省略。
com_op
該操作符對應(yīng)的交換(commutator)操作符。
neg_op
對應(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 長的(缺省為 31 個(gè))下列字符組成的字串:
+ - * / < > = ~ ! @ # % ^ & | ` ? $   
你選擇名字的時(shí)候有幾個(gè)限制:
"$" 和 ":" 不能定義為單字符操作符, 但是它們可以是一個(gè)多字符操作符的名稱的一部分.
"--" 和 "/*" 不能在操作符名字的任何地方出現(xiàn), 因?yàn)樗鼈儠徽J(rèn)為是一個(gè)注釋的開始.
一個(gè)多字符的操作符名字不能以 "+" 或 "-" 結(jié)尾, 除非該名字還包含至少下面字符之一:
~ ! @ # % ^ & | ` ? $     
例如, @- 是一個(gè)允許的操作符名, 但 *- 不是. 這個(gè)限制允許 PostgreSQL 分析 SQL-有問題的查詢而不要求在符號之間有空白.
注意: 當(dāng)使用非 SQL-標(biāo)準(zhǔn)操作符名時(shí), 你通常將需要用空白把聯(lián)接的操作符分離開以避免含混.例如,如果你定義了一個(gè)左目操作符,名為 "@",你不能寫 X*@Y ;你必須寫成 X* @Y 以保證 PostgreSQL 把它讀做兩個(gè)操作符而不是一個(gè).
操作符 "!=" 在輸入時(shí)映射成 "<>", 因此這兩個(gè)名稱總是相等的.
至少需要定義一個(gè) LEFTARG 或 RIGHTARG. 對于雙目操作符來說,兩者都需要定義. 對右目操作符來說,只需要定義 LEFTARG, 而對于左目操作符來說,只需要定義 RIGHTARG.
同樣, func_name 過程必須已經(jīng)用 CREATE FUNCTION 定義過, 而且必須定義為接受正確數(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í)行代碼總是使用后面的形式而某種程度上簡化了查詢優(yōu)化器.
類似地,如果存在負(fù)號操作符則也應(yīng)該聲明。 假設(shè)一個(gè)操作符,面積相等, ===,存在,同樣有一個(gè)面積不等操作符, !==. 負(fù)號操作符允許查詢優(yōu)化器將
NOT MYBOXES.description === box '((0,0), (1,1))'
   
簡化成
MYBOXES.description !== box '((0,0), (1,1))'   
如果提供了一個(gè)交換操作符名稱, PostgreSQL 將在表中查找它.如果找到,而且其本身沒有一個(gè)交換符,那么交換符表將被更新,以當(dāng)前(最新)創(chuàng)建的操作符作為它的交換符.這一點(diǎn)一樣適用于負(fù)號操作符. 這就允許定義兩個(gè)互為交換符或負(fù)號符的操作符.第一個(gè)操作符應(yīng)該定義為沒有交換符或負(fù)號符(as appropriate).當(dāng)定義第二個(gè)操作符時(shí),將第一個(gè)符號作為交換符或負(fù)號符.第一個(gè)將因上述的副作用一樣被更新(而獲得交換符 或負(fù)號符).(對于PostgreSQL 6.5, 把兩個(gè)操作符指向?qū)Ψ酵瑯右残小#?
HASHES,SORT1 和 SORT2 選項(xiàng)將為查詢優(yōu)化器進(jìn)行連接查詢時(shí)提供支持. PostgreSQL 能夠總是用反復(fù)替換來計(jì)算一個(gè)連接(也就是說,處理這樣的子句,該子句有兩個(gè)元組變量,這兩個(gè)變量被一個(gè)操作符分開,這個(gè)操作符返回一個(gè)boolean量) [WONG76]. 另外, PostgreSQL 可以延著 [SHAP86]實(shí)現(xiàn)一個(gè)散列-連接算法(hash-join algorithm);但是,我們必須知道這個(gè)策略是否可行.目前的散列-連接算法只是對代表相等測試的操作符有效;而且,數(shù)據(jù)類型的相等必須意味著類型的表現(xiàn)是按位相等的。(例如,一個(gè)包含未用的位的數(shù)據(jù)類型,這些位對相等測試沒有影響,但卻不能用于哈希連接。)HASHES 標(biāo)記告訴優(yōu)化器,對這個(gè)操作符可以安全地使用哈希連接。
類似的,兩目排序操作符告訴查詢優(yōu)化器一個(gè)融合-排序 (merge-sort)是否是一個(gè)可用的連接策略,并且告訴優(yōu)化器使用哪個(gè)操作符來對這兩個(gè)操 作數(shù)表排序.排序操作符應(yīng)該只提供給相等操作符, 并且它們應(yīng)該對應(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)合策略的方法看來與其實(shí)現(xiàn)的復(fù)雜性相比是不值得的。
RESTRICT 和 JOIN 選項(xiàng)幫助優(yōu)化器計(jì)算結(jié)果的尺寸大小.如果像下面的語句:
MYBOXES.description <<< box '((0,0),(1,1))'   
在判斷條件中出現(xiàn),那么 PostgreSQL 將不得不估計(jì) MYBOXES 中滿足該子句的記錄數(shù)量的范圍的大小. 函數(shù) res_proc 必需是一個(gè)注冊過的函數(shù)(也就是說它已經(jīng)用 CREATE FUNCTION定義過了),它接受一個(gè)正確數(shù)據(jù)的數(shù)據(jù)類型作為參數(shù),返回一個(gè)浮點(diǎn)數(shù).查詢優(yōu)化器只是簡單的調(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)化操作符并且可以決定使用索引來縮小相關(guān)操作符的搜索區(qū)間.但是,對函數(shù)將不會有任何優(yōu)化的動(dòng)作,而且是強(qiáng)制 執(zhí)行.最后,函數(shù)可有任意個(gè)參數(shù),而操作符限于一個(gè)或兩個(gè).
注意
請參閱 PostgreSQL 用戶手冊 中操作符章節(jié)獲取更多信息.請使用 DROP OPERATOR 從數(shù)據(jù)庫中刪除用戶定義操作符.  
上一篇:06—PL/SQL編程

下一篇:SQL大全[2]

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 抚宁县| 同江市| 五台县| 阿瓦提县| 波密县| 洛阳市| 阜宁县| 平顺县| 壶关县| 平邑县| 株洲县| 新田县| 垫江县| 个旧市| 精河县| 濮阳市| 嘉黎县| 阜宁县| 永济市| 建宁县| 五原县| 庄河市| 屏南县| 阳江市| 通化县| 红安县| 西充县| 嘉祥县| 东丰县| 城市| 凤翔县| 教育| 进贤县| 克山县| 宾阳县| 石景山区| 东城区| 平江县| 临江市| 长垣县| 乌审旗|