SQL常用命令集錦
[重要通告]如您遇疑難雜癥,本站支持知識付費業務,掃右邊二維碼加博主微信,可節省您寶貴時間哦!
以下內容包含那些 PostgreSQL 支持的 SQL 命令的信息.這里的 "SQL" 就是該語言通常的含義;
每條命令的與標準有關的兼容性的信息可以在相關的參考頁中找到.
(非原創,這些玩意,就為了自己好用,木有轉載說明,要有也是mssql官方網站)
Table of Contents
ABORT --? 退出當前事務
ALTER GROUP --? 向組中增加用戶或從組中刪除用戶
ALTER USER --? 改變數據庫用戶帳號.
ANALYZE --? 收集與數據庫有關的統計
BEGIN --? 開始一個事務塊
CHECKPOINT -- 強制一個事務日志檢查點
CLOSE --? 關閉一個游標
CLUSTER --? 根據一個索引對某個表集簇
COMMENT --? 定義或者改變一個對象的評注
COMMIT --? 提交當前事務
COPY --? 在表和文件之間拷貝數據
CREATE AGGREGATE --? 定義一個新的聚集函數
CREATE CONSTRAINT TRIGGER --? 定義一個新的約束觸發器
CREATE DATABASE --? 創建新數據庫
CREATE FUNCTION --? 定義一個新函數
CREATE GROUP --? 定義一個新的用戶組
CREATE INDEX --? 定義一個新索引
CREATE LANGUAGE -- 定義一種新的過程語言
CREATE OPERATOR --? 定義一個新的操作符
CREATE RULE --? 定義一個新的重寫規則
CREATE SEQUENCE --? 創建一個新的序列發生器
CREATE TABLE --? 定義一個新表
CREATE TABLE AS -- 從一條查詢的結果中創建一個新表
CREATE TRIGGER --? 定義一個新的觸發器
CREATE TYPE --? 定義一個新的數據類型
CREATE USER --? 創建一個新的數據庫用戶帳戶
CREATE VIEW --? 定義一個視圖
DECLARE --? 定義一個游標
DELETE --? 刪除一個表中的行
DROP AGGREGATE --? 刪除一個用戶定義的聚集函數
DROP DATABASE --? 刪除一個數據庫.
DROP FUNCTION --? 刪除一個用戶定義的函數
DROP GROUP --? 刪除一個用戶組
DROP INDEX --? 刪除一個索引
DROP LANGUAGE --? 刪除一個用戶定義的過程語言
DROP OPERATOR --? 刪除一個用戶定義操作符
DROP RULE --? 刪除一個重寫規則
DROP SEQUENCE --? 刪除一個序列
DROP TABLE --? 刪除一個表
DROP TRIGGER --? 刪除一個觸發器定義.
DROP TYPE --? 刪除一個用戶定義數據類型
DROP USER --? 刪除一個數據庫用戶帳號
DROP VIEW --? 刪除一個視圖
END --? 提交當前的事務
EXPLAIN --? 顯示語句執行規劃
FETCH --? 用游標從表中抓取行
GRANT --? 定義訪問權限
INSERT --? 在表中創建新行
LISTEN --? 監聽一個通知
LOAD -- 裝載或重載一個共享庫文件
LOCK --? 明確地鎖定一個表
MOVE --? 把游標放到表中的特定的行
NOTIFY --? 生成一個通知
REINDEX --? 恢復一個損壞了的索引
RESET -- 把一個運行時參數值恢復為缺省值
REVOKE --? 刪除訪問權限.
ROLLBACK --? 退出當前事務
SELECT --? 從表或視圖中取出若干行.
SELECT INTO --? 從一個查詢的結果中創建一個新表
SET -- 改變運行時參數
SET CONSTRAINTS -- 設置當前事務的約束模式
SET SESSION AUTHORIZATION --? 為當前會話設置會話用戶標識符和當前用戶標識符
SET TRANSACTION -- 設置當前事務的特性
SHOW -- 顯示運行時參數的數值
TRUNCATE --? 清空一個表
UNLISTEN --? 停止監聽通知信息
UPDATE --? 更新一個表中的行
VACUUM --? 垃圾收集以及可選地分析一個數據庫
----------------------------------------------------------------------------
----
ABORT 退出當前事務
ABORT?? Name
ABORT? --? 退出當前事務
Synopsis
ABORT [ WORK | TRANSACTION ]
輸入
無
輸出
ROLLBACK???????? 成功的返回信息.
NOTICE: ROLLBACK: no transaction in progress
如果當前沒有任何正在處理的事務存在.
描述
ABORT回卷當前事務并且廢棄所有當前事務中做的更新. 這個命令和 命令 ROLLBACK
完全一樣, 只是由于歷史原因而保留下來.
注意
用COMMIT語句可以成功地結束/提交一個事務.
用法
取消所有更改:
ABORT WORK;
兼容性 SQL92
此命令是 PostgreSQL 基于歷史原因做的擴展. ROLLBACK 是 中等價的命令.
----------------------------------------------------------------------------
----
ALTER GROUP向組中增加用戶或從組中刪除用戶
ALTER GROUP
Name
ALTER GROUP? --? 向組中增加用戶或從組中刪除用戶
Synopsis
ALTER GROUP name ADD USER username [, ... ]
ALTER GROUP name DROP USER username [, ... ]
輸入
Name
要更改的組名稱。
Username
準備向組中增加或從組中刪除的用戶名。用戶名必須已經存在。
輸出
ALTER GROUP
更改成功的返回信息。
描述
ALTER GROUP用于向組中增加用戶或者從組中刪除用戶。 只有數據庫超級用戶才能使用
這條命令。向組中增加用戶并不創建用戶。同樣從組中刪除用戶也不刪除用戶本身。
使用 CREATE GROUP創建新組以及 DROP GROUP刪除一個組。
用法
向組中增加用戶:
ALTER GROUP staff ADD USER Karl, john;
從組中刪除用戶:
ALTER GROUP workers DROP USER Beth;
兼容性 SQL92
里沒有 ALTER GROUP 語句。角色(roles)的概念與之類似。
----------------------------------------------------------------------------
----
ALTER TABLE修改表的定義
ALTER TABLE
Name
ALTER TABLE? --? 修改表的定義
Synopsis
ALTER TABLE [ ONLY ] table [ * ]
ADD [ COLUMN ] column type [ column constraint [ ... ] ]
ALTER TABLE [ ONLY ] table [ * ]
ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }
ALTER TABLE [ ONLY ] table [ * ]
ALTER [ COLUMN ] column SET STATISTICS integer
ALTER TABLE [ ONLY ] table [ * ]
RENAME [ COLUMN ] column TO new column
ALTER TABLE
RENAME TO new table
ALTER TABLE
ADD table constraint definition
ALTER TABLE [ ONLY ] table
DROP CONSTRAINT constraint
{ RESTRICT | CASCADE }
ALTER TABLE table
OWNER TO new owner
輸入
table
試圖更改的現存表的名稱.
column
現存或新的列名稱.
type
新列的類型.
newcolumn
現存列的新名稱.
new table
表的新名稱.
table constraint definition
表的新的約束定義.
New user
該表的新所有者的用戶名.
輸出
ALTER
從被改名的列或表返回的信息.
ERROR
如果一個列或表不存在返回的信息.
描述
ALTER TABLE變更一個現存表的定義.
ADD COLUMN形式使用與 CREATE TABLE一樣的語法向表中增加一個新列/字段。
ALTER COLUMN SET/DROP DEFAULT形式允許你從列/字段中設置或者刪除缺省(值)。
注意缺省(值)只適用于隨后的 INSERT 命令。 它們不會改變已經存在于表中的行.
ALTER COLUMN SET STATISTICS形式允許你為 隨后的 ANALYZE 操作 設置收集統計信
息的對象.
RENAME 子句可以在不影響任何相關數據的情況下更改 一個表,字段,索引或者序列名
稱。因此, 在此命令執行后數據仍將是相同尺寸和類型。
ADD table constraint definition子句使用與 CREATE TABLE一樣的語法向表中增加一
個新的約束。
DROP CONSTRAINT constraint子句刪除所有表上匹配 constraint 的 CHECK 約束(以及
其子表)
OWNER 把該表的所有者改為用戶 new user.
如果要改變表的綱要,你必須是表的所有者.
注意
COLUMN 關鍵字是多余的,可以省略.
在目前的 ADD COLUMN實現里還不支持 新列/字段的缺省(值)和 NOT NULL 子句。不
過你可以隨后用 ALTER TABLE 的 SET DEFAULT 形式設置缺省(值)。(你可能還想用
UPDATE 把已存在行更新為缺省值。)
目前只有 CHECK 約束可以從表中刪除.RESTRICT 關鍵字是必須的,盡管 并不檢查依
賴性.還不支持 CASCADE 選項.要刪除一個 PRIMARY 或者 UNIQUE 約束,用 DROP
INDEX 命令刪除相關的索引. 要刪除 FOREIGN KEY 約束,你需要重新創建并重新裝載
該表, 創建的時候使用 CREATE TABLE命令的其它參數.
比如,要刪除在表 distributors 上的所有約束∶
CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors AS SELECT * FROM temp;
DROP TABLE temp;
要修改表的結構,你必須是表的所有人。不允許更改系統表結構的任何部分。
PostgreSQL 用戶手冊里有關于繼承的更多信息.
請參考CREATE TABLE 部分獲取更多有效參數的描述.
用法
向表中增加一個 varchar 列:
ALTER TABLE distributors ADD COLUMN address VARCHAR(30);
對現存列改名:
ALTER TABLE distributors RENAME COLUMN address TO city;
更改現存表的名字∶
ALTER TABLE distributors RENAME TO suppliers;
給一個表增加一個檢查約束∶
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) =
5);
刪除一個表和它的所有子表的監查約束∶
ALTER TABLE distributors DROP CONSTRAINT zipchk;
向表中增加一個外鍵約束:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address)
REFERENCES addresses(address) MATCH FULL;
給表增加一個(多字段)唯一約束∶
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id,
zipcode);
兼容性 SQL92
ADD COLUMN 形式是兼容的,除了上面說的缺省(值)和 NOT NULL 約束外。 ALTER
COLUMN 形式是完全兼容的。
對 ALTER TABLE 聲明了一些附加的 PostgreSQL 目前還不直接支持的功能:
ALTER TABLE table DROP [ COLUMN ] column { RESTRICT | CASCADE }
從一個表中刪除一個列. 目前,要刪除一個現存的列,表必須重新創建和重新裝載:
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 對 的擴展。
----------------------------------------------------------------------------
----
ALTER USER
ALTER USER
Name
ALTER USER? --? 改變數據庫用戶帳號.
Synopsis
ALTER USER username [ [ WITH ] option [ ... ] ]
這里 option 可以是∶
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| VALID UNTIL 'abstime'
輸入
username
想進行更改的用戶的名字。
[ encrypted | unencrypted ] password
此帳號所使用的新口令。 Encrypted/ unencrypted 控制該口令在數據庫里是否以加密
形式存儲.
CREATEDB
NOCREATEDB
這個子句定義該用戶創建數據庫的能力。 如果聲明了 CREATEDB,該用戶可以創建她自
己的數據庫。用 NOCREATEDB 將剝奪一個用戶創建數據庫的能力。
CREATEUSER
NOCREATEUSER
這個子句決定一個用戶能否創建新用戶。 這個選項同樣還令該用戶成為超級用戶,可
以超越所有訪問限制。
abstime
該用戶帳號口令的有效日期(和可選的時間)。
輸出
ALTER USER
更改成功的返回信息.
ERROR: ALTER USER: user "username" does not exist
如果數據庫不認識你所聲明的用戶返回的信息.
描述
ALTER USER用于更改用戶的 PostgreSQL 帳號的屬性.沒有在該命令中出現的屬性保持
原值.
只有一個數據庫超級用戶可以用這個命令更改權限和口令有效期。 普通用戶只能更改
他們自己的口令。
ALTER USER無法改變一個用戶的組的成員性. 用 ALTER GROUP實現這個目地.
使用 CREATE USER創建新用戶和 DROP USER刪除用戶。
用法
更改一用戶口令:
ALTER USER divide WITH PASSWORD 'hu8jmn3';
更改一用戶有效期
ALTER USER Manuel VALID UNTIL 'Jan 31 2030';
更改一用戶有效期, 聲明其權限應該在用比UTC早一小時的時區記時的1998年5月4日正
午失效
ALTER USER Chris VALID UNTIL 'May 4 12:00:00 1998 +1';
賦予一用戶創建新用戶和新數據庫的權限:
ALTER USER Miriam CREATEUSER CREATEDB;
兼容性 SQL92
里沒有 ALTER USER. 該標準將用戶定義部分交給具體數據庫實現處理.
----------------------------------------------------------------------------
----
ANALYZE
ANALYZE
Name
ANALYZE? --? 收集與數據庫有關的統計
Synopsis
ANALYZE [ VERBOSE ] [ table [ (column [, ...] ) ] ]
輸入
VERBOSE
打開處理過程信息的顯示.
table
要分析的特定表的名字.缺省是所有表.
column
要分析的特定行的名字.缺省是所有列.
輸出
ANALYZE
命令已經結束了.
描述
ANALYZE收集有關 PostgreSQL 表的內容的統計,然后把結果保存在系統表
pg_statistic 里.隨后,查詢規劃器就可以使用這些統計幫助判斷查詢的最有效的 規
劃.
如果沒有參數,ANALYZE 檢查在當前數據庫里的所有 表.如果有參數,ANALYZE 只檢
查那個表. 你還可以給出一列字段名字,這個時候只有那些字段的統計信息被更新.
注意
周期性地運行 ANALYZE,或者在對表的 大部分內容做了更改之后馬上運行它是個好習
慣,準確的統計信息將幫助規劃器選擇最合適的查詢規劃,并因此 而改善查詢處理的
速度.一種比較經常采用的策略是每天在 低負荷的時候運行一次 VACUUM和 ANALYZE.
和 VACUUM FULL 不同的是, ANALYZE 只需要在目標表上有一個讀取鎖, 因此它可以
和表上的其它活動并行地運行.
對于大表,ANALYZE 采集表內容的一個隨機的抽樣做 統計,而不是檢查每一行.這樣
即使是很大的表,我們也只需要很少的一些 時間就可以完成分析.不過要注意的是統
計只是近似的結果,而且每次運行ANALYZE都會有一些小變化,即使表內容實際上 沒有
改變也這樣.這樣會導致 EXPLAIN 所顯示的 規劃器計算的開銷有一些小變化,
收集的統計信息通常包括一個每字段最常用數值的列表以及 一個包線圖,顯示每個字
段里數據的近似分布.如果 ANALYZE 認為它們都沒有什么用, (比如,在一個唯一鍵
字的字段上沒有公共的數值) 或者是該字段數據類型不支持相關的操作符,那么它們都
可以忽略.在用戶手冊 中有關于統計的更多信息.
分析的廣度可以通過用 ALTER TABLE ALTER COLUMN SET STATISTICS (參閱 ALTER
TABLE調整每字段的統計目標來控制.目標數值設置最常用數值列表中的記錄的最大數
目以及包線圖中的最大塊數.缺省的目標數值是 10,不過我們可以調節 這個數值獲取
規劃器計算精度和 ANALYZE 運行所需要的 時間以及 pg_statistic 里面占據的空間數
目之間的 平衡.特別是,把統計目標設置為零就關閉了該字段的統計收集. 對那些從
來不參與到查詢的 WHERE,GROUP BY,或者 ORDER BY 子句里的字段 是很有用的,因
為規劃器不會使用到這樣的字段上的統計. )
在被分析的字段中最大的統計目標決定為統計采樣的表中的行的數目. 增大目標會導
致做 ANALYZE 的時候成比例地 增大對時間和空間的需求.
兼容性 SQL92
里沒有 ANALYZE 語句.
----------------------------------------------------------------------------
----
BEGIN
BEGIN
Name
BEGIN? --? 開始一個事務塊
Synopsis
BEGIN [ WORK | TRANSACTION ]
輸入
WORK
TRANSACTION
可選關鍵字。沒什么作用。
輸出
BEGIN
這表明一個新的事務已經開始.
NOTICE: BEGIN: already a transaction in progress
這表明該事務已經運行,當前事務不受影響.
描述
缺省時,PostgreSQL 以 非鏈接模式(unchained mode) (在其他數據庫系統里也稱
之為"自動提交("autocommit"))"。 換句話說,每個用戶語句都是在其自身的事務
中運行并且在語句結束時隱含的調用一個提交(commit)(如果執行成功則提交,否則
調用一個回卷)。 BEGIN 以鏈接模式(chained mode)初始化一個用戶事務,也就是
說所有 BEGIN 命令后的用戶語句都將在一個事務里面執行直到一個明確的 COMMIT,
ROLLBACK, 或執行退出(abort)。在鏈接模式里執行的語句很明顯地快得多,因為事
務開始/提交(start/commit)需要大量的CPU和磁盤活動。在一個 事務內部執行多條
語句時因為可能修改若干個相關的表因而同樣需要一致性。
在 PostgreSQL 里缺省的事務隔離級別是 READ COMMITTED, 這時在事務內部的查詢只
看到查詢提交之前的(數據)修改。 所以,如果你需要更嚴格的事務隔離,你必須在
BEGIN 后馬上使用 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE。 在
SERIALIZABLE 模式里,查詢將只能看到整個事務開始之前的修改。 (實際上是在一個
可串行化事務內部第一個 DML 語句執行前的數據)。
如果提交了事務, PostgreSQL 將保證要么實現所有更新, 要么所有更新都沒有實
現。事務有標準的 ACID (原子性,一致性,隔離性,持續性) (atomic,
consistent,isolatable,and durable)屬性。
注意
請參考 LOCK語句獲取關于在事務內部鎖定一個表的詳細信息.
使用 COMMIT或者 ROLLBACK結束一個事務.
用法
開始一個用戶事務:
BEGIN WORK;
兼容性 SQL92
BEGIN是 PostgreSQL 語言的擴展. 在 中沒有明確的 BEGIN 的定義;事務初始化總是
隱含的而且使用一個 COMMIT 或者 ROLLBACK 語句終止.
注意: 許多關系型數據庫為了方便提供一個自動提交(autocommit)特性。
順便說一句,BEGIN 關鍵字在嵌入 SQL 里用于不同的目的。 我們建議你在移植數據庫
應用時仔細檢查事務的語意。
還要求事務的缺省隔離級別是 SERIALIZABLE。
CHECKPOINT
CHECKPOINT
Name
CHECKPOINT -- 強制一個事務日志檢查點
Synopsis
CHECKPOINT
描述
預寫式日志(Write-Ahead Logging (WAL))缺省時在事務日志中每隔一段時間放一個
檢查點.(要調整這個原子化的檢查點間隔, 你可以參考運行時 選項
CHECKPOINT_SEGMENTS 和 CHECKPOINT_TIMEOUT .) CHECKPOINT 強迫在命令聲明時立
即進行檢查, 而不是等到下一次調度時的檢查點.
檢查點是一個事務日志訓練中的點,在該點,所有數據文件都被更新 以反映日志中的
信息.所有數據文件都將被沖刷到磁盤.請參考 PostgreSQL 管理員手冊獲取更多有關
WAL 系統的信息.
只有超級用戶可以調用 CHECKPOINT. 該命令不是設計用于正常操作過程中的.
又見
PostgreSQL 管理員手冊
兼容性 SQL92
CHECKPOINT命令是 PostgreSQL 語言的擴展.
----------------------------------------------------------------------------
----
CLOSE
CLOSE
Name
CLOSE? --? 關閉一個游標
Synopsis
CLOSE cursor
輸入
cursor?????? 一個待關閉的游標的名字.
輸出
CLOSE? 游標關閉成功返回的信息.
NOTICE PerformPortalClose: portal "cursor" not found
如果該 cursor 沒有聲明或已經關閉,返回該信息.
描述
CLOSE釋放和一個游標關聯的資源. 一個游標關閉后,不允許對其再做任何操作.一個
不再使用的游標應該關閉掉.
如果用 COMMIT 或 ROLLBACK 提交了一個事務,將對每個打開的游標執行隱含的關閉操
作.
注意
PostgreSQL 沒有明確的 OPEN (打開)游標的語句; 我們認為一個游標在聲明時就打
開了.使用 DECLARE 語句聲明一個游標.
用法
關閉游標liahona:
CLOSE liahona;
兼容性 SQL92
CLOSE與 完全兼容.
----------------------------------------------------------------------------
----
CLUSTER
Name
CLUSTER? --? 根據一個索引對某個表集簇
Synopsis
CLUSTER indexname ON table name
輸入
indexname
一個索引名稱.
table
準備建簇的表的名稱.
輸出
CLUSTER
成功建簇.
ERROR: relation <tablerelation_number> inherits "table"
ERROR: Relation table does not exist!
描述
CLUSTER指示PostgreSQL 近似地基于索引 indexname 的度量對表 table 進行存儲建
簇. 索引必須已經在表 table name. 上定義了.
當對一個表建簇后,該表的物理存儲將基于索引信息進行. 建簇是靜態的,也就是
說,當表被更新后,改變的內容不會建簇. 不會試圖對更新過的記錄重新建簇.如果
需要,可以通過手工執行該命令的方法重建簇.
注意
該表實際上按索引順序拷貝到了一個臨時表中,然后重新改成原名. 因此,在建簇時
所有賦予的權限和其它索引都將丟失.
如果你只是隨機的訪問表中的行, 那么在堆表中的數據的實際存儲順序是無關緊要
的. 但是,如果你對某些數據的訪問多于其他數據,而且有一個索引將這些數據分
組,那你就將從 使用 CLUSTER 中獲益.
另一個CLUSTER 很有幫助的例子是當你用索引從一個表中取出幾個記錄時. 如果你從一
個表中請求一定索引范圍的值,或者是一個索引過的值對應多行, CLUSTER 也會有助
于應用,因為如果索引標識出第一匹配行所在的堆存儲頁,所有 其他行也可能已經在
同一堆存儲頁里了, 這樣便節省了磁盤訪問的時間,加速了查詢.
有兩種建簇的數據.第一種是用 CLUSTER 命令,此命令將原表按你聲明的索引重新排
列. 這個動作在操作大表時可能會很慢, 因為每一行都從堆存儲頁里按索引順序取
出,如果存儲頁表沒有排序,整個表是隨機存放在各個頁面的,因而每行都要進行依次
磁盤頁面操作. PostgreSQL 有一個緩沖, 但一個大表的主體是不可能都放到緩沖去
的.
另一個對數據建簇的方法是使用
SELECT column list INTO TABLE new table
FROM table ORDER BY column list
這個用法使用PostgreSQL 排序的代碼 ORDER BY 來匹配索引,在對未排序的數據操作
時速度快得多. 然后你可以刪除舊表,用 ALTER TABLE...RENAME將 new table 改成
舊表名, 并且重建該表所有索引.唯一的問題是 OID 將不保留.這時再做 CLUSTER
將快得多, 因為大多數堆棧數據已經排過序了而且使用現有的索引.
用法
以雇員的薪水屬性對雇員關系建簇.
CLUSTER emp_ind ON emp;
兼容性 SQL92
在 規范里沒有 CLUSTER 語句.
----------------------------------------------------------------------------
----
COMMENT
COMMENT
Name
COMMENT? --? 定義或者改變一個對象的評注
Synopsis
COMMENT ON
[
[ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ] object_name |
COLUMN table_name.column_name|
AGGREGATE agg_name agg_type|
FUNCTION func_name (arg1, arg2, ...)|
OPERATOR op (leftoperand_type rightoperand_type) |
TRIGGER trigger_name ON table_name
] IS 'text'
輸入
object_name, table_name, column_name, agg_name, func_name, op, trigger_name
要加入評注的對象名稱.
text
要加入的評注.
輸出
COMMENT???? 成功對表評注后的返回.
描述
COMMENT存儲一個數據庫對象的評注, 這個評注可以很容易用 psql的 /dd或 /d+ 或者
/l+ 命令檢索出來.其它檢索評注的用戶接口可以建設在 psql 所用地同樣地內部函數
的基礎上,也就是 obj_description() 和 col_description().
要修改一個評注,為同一個對象發出一條新的 COMMENT 命令即可.每個對象只存儲一
條評注. 要刪除評注,在文本字串的位置寫上 NULL.當刪除對象時,評注自動被刪除
掉.
需要說明的是目前評注沒有安全機制∶任何聯接到某數據庫上地用戶 都可以看到所有
該數據庫對象地評注(盡管只有超級用戶可以修改 不屬于它地對象的評注).因此,不
要在評注里放安全性敏感地信息.
用法
給表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? --? 提交當前事務
Synopsis
COMMIT [ WORK | TRANSACTION ]
輸入
WORK
TRANSACTION
可選關鍵字。沒有作用。
輸出
COMMIT
提交成功返回此信息.
NOTICE: COMMIT: no transaction in progress
如果過程中沒有事務,返回此信息.
描述
COMMIT提交當前事務. 所有事務的更改都將為其他事務可見,而且保證當崩潰發生時
的可持續性.
注意
關鍵字 WORK 和 TRANSACTION 都可以忽略.
使用 ROLLBACK語句退出一次事務.
用途
要讓所有變更永久化:
COMMIT WORK;
兼容性 SQL92
只聲明了兩種形式 COMMIT 和 COMMIT WORK。否則完全兼容。
----------------------------------------------------------------------------
----
COPY
COPY
Name
COPY? --? 在表和文件之間拷貝數據
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
改變字段格式行為,強制所有數據都使用二進制格式存儲和讀取, 而不是以文本的方
式. DELIMITERS 和 WITH NULL 選項和二進制格式無關.
table
現存表的名字.
WITH OIDS
拷貝每行的內部唯一對象標識(OID).
filename
輸入或輸出的 Unix 文件的絕對文件名.
stdin
聲明輸入是來自客戶端應用.
stdout
聲明輸入前往客戶端應用.
delimiter
用于在文件中每行中分隔各個字段的字符.
null string
個代表 NULL 值的字串。缺省是 "/N" (反斜杠-N)。 當然,你可以自己挑一個空字
串。
注意: 對于拷貝入(copy in),任何匹配這個字串的字串將被存儲為 NULL 值, 所以
你應該確保你用 的字串和拷貝出(copy out)相同。
輸出
COPY
拷貝成功完成.
ERROR: reason
拷貝失敗,原因在錯誤信息里.
描述
COPY在 PostgreSQL表和標準文件系統文件之間交換數據. COPY TO 把一個表的所有內
容都拷貝到一個文件, 而 COPY FROM 從一個文件里拷貝數據到一個表里 (把數據附
加到表中已經存在的內容里).
COPY指示 PostgreSQL 后端直接從文件中讀寫數據.如果聲明了文件名,那么該文件必
須為后 端可見,而且文件名必須從后端的角度聲明.如果聲明的是 stdin 或
stdout, 數據通過客戶前端流到后端.
小提示: 不要把 COPY 和 psql 指令 /copy 混淆在一起. /copy 調用 COPY FROM
stdin 或 COPY TO stdout,然后抓取/存儲 psql 客戶端可以訪問的一個文件里. 因
此,使用 /copy 的時候, 可訪問性和訪問權限取決于客戶端而不是服務器端.
注意
BINARY 關鍵字將強制使用二進制對象而不是文本存儲/讀取所有數據. 這樣做在一定
程度上比傳統的拷貝命令快,但二進制拷貝文件在不同機器體系間的植性不是很好.
缺省地,文本拷貝使用 tab ("/t")字符作為分隔符. 分隔符仍然可以用關鍵字
USING DELIMITERS 改成任何其它的字符. 在數據中碰巧與分隔符相同的字符將用反斜
扛引起.
你對任何要COPY 出來的數據必須有select 權限,對任何要 COPY 入數據的表必須有
insert 或 update 權限. 使用 COPY 時后端同樣需要適當的對文件操作的 Unix 權
限.
COPY TO不會激活規則,也不會處理字段缺省值。不過它的確激活觸發器和檢查約束。
COPY在第一個錯誤處停下來.這些在 COPY FROM中不應該導致問題,但在 COPY TO 時
目的表會已經接收到早先的行, 這些行將不可見或不可訪問,但是仍然會占據磁盤空
間. 如果你碰巧是拷貝很大一塊數據文件的話,積累起來,這些東西可能會占據相當
大的一部分磁盤空間. 你可以調用 VACUUM來恢復那些磁盤空間.
COPY命令里面的文件必須是可以由后端直接讀或寫的文件,而不是由客戶端應用讀寫.
因此,它們必須位于數據庫服務器上或者可以為數據庫服務器所訪問, 而不是由客戶
端做這些事情. 它們必須是PostgreSQL用戶(服務器運行的用戶 ID) 可以訪問到并
且 可讀或者可寫,而不是客戶端. COPY 到一個命名文件是只允許數據庫超級用戶進
行的, 因為它允許寫任意后端有權限寫的文件.
小技巧: psql指令 /copy 以客戶的權限讀或寫在客戶端的文件,因此不局限于超級用
戶.
我們建議在 COPY 里的文件名字總是使用 絕對路徑.在 COPY TO 的時候是由后端強制
進行的,但是對于 COPY FROM,你的確有從一個聲明為相對路徑的文件里讀取的選
擇.該路徑將解釋為相對于后端的 工作目錄(在 $PGDATA 里的什么地方), 而不是
客戶端的工作目錄.
文件格式
文本格式
當不帶 BINARY 選項使用 COPY TO 時, 生成的文件每條元組占據一行,每列(字段)
用分隔符分開.內嵌的分隔符字 符將由一個反斜杠("/")開頭. 字段值本身是由與
每個字段類型相關的輸出函數生成的字符串.某一類型的輸出函數本身不應該生成反斜
杠;這個任務由 COPY 本身完成.
每個元組的實際格式是
<attr1><separator><attr2><separator>...<separator><attrn><newline>??? 請注意
每行的結尾是用 Unix 風格的換行符("/n")標記的. 如果給出的文件包含 DOS 或
Mac 風格的換行符,那么 COPY FROM 將會出錯.
如果聲明了 WITH OIDST,它將被放在每行的開頭.
如果 COPY TO 將它的輸出輸出到標準輸出而不是一個文件, 在拷貝結束時,它將在一
個新行上輸出一個反斜杠("/")和一 個句點("."),最后是一個換行符做為文件結
束符.類似,如果 COPY FROM 從標準輸入讀入數據,它將把一行開頭的由一個 反斜杠
("/")和一個句點(".")和一個換行符組成的這三個連續字符作為文件結束符. 不
過,如果在這個特殊的文件結束模式出現 前關閉了輸入聯接,那么COPY FROM 將正確
結束(接著就是后端自身).
反斜杠有其他的含義.一個文本反斜杠字符輸出成兩個連續的反斜杠 ("http://") 一個文
本tab字符用一個反斜 杠后面跟一個tab代表. (如果你使用了非 tab 作為列分隔符,
那么在數據中出現的該字符將會使用反斜扛轉意.) 一個文本新行字符用一個反斜杠和
一個新行代表. 當裝載不是由 PostgreSQL 生成的文件時,你需要將反 斜杠字符
("/")轉換成雙反斜杠("http://")以保證正確裝載.
二進制格式
在PostgreSQLv7.1 中的 COPY BINARY 的文件格式做了變化.新格式由一個文件頭,零
或多條元組, 以及文件尾組成.
文件頭
文件頭由 24 個字節的固定域組成,后面跟著一個變長的頭擴展區.固定域是:
簽名
12-字節的序列 "PGBCOPY/n/377/r/n/0" --- 請注意空是簽名是要求的一部分.(使用
這個簽名是為了讓我們能夠很容易看出文件是否已經被一個非 8 位安全的轉換器給糟
蹋了.這個簽名會被換行符轉換過濾器,刪除空,刪除高位,或者奇偶的改變而改
變.)
整數布局域
以源機器的字節序的 int32 常量 0x1020304.如果在這里偵測到錯誤的字節序,那么
讀者很可能在后面的字段列造成了字節錯位.
標志域
int32 位掩碼表示該文件格式的重要方面.位是從 0(LSB)到 31 (MSB)編碼的 ---
請注意這個域是以源機器的位權重存儲的,后繼的整數都是如此.位 16 - 31 是保留
用做關鍵文件格式的;如果讀者發現一個不認識的位出現在這個范圍內,那么它應該退
出.位 0-15 都保留為標志向后兼容的格式使用;讀者可以忽略這個范圍內的不認識的
位.目前只定義了一個標志位,而其它的必須是零:
Bit 16
如果為 1,那么在傾倒中包括了 OID;如果為 0,則沒有
頭擴展范圍長度
int32 以字節計的頭剩余長度,不包括自身.在初始的版本里,它將會是零,后面緊跟
第一條元組.對該格式的更多的修改都將允許額外的數據出現在頭中.讀者應該忽略任
何它不知道該如何處理的頭擴展數據.
頭擴展數據是一個用來保留一個自定義的數據訓練用的.這個標志域無意告訴讀者擴展
區的內容是什么.頭擴展的具體設計內容留給以后的版本用.
這樣設計就允許向下兼容頭附加(增加頭擴展塊,或者設置低位序標志位) 以及非向
下兼容修改(設置高位標志位以標識這樣的修改,并且根據需要向擴展區域增加支持數
據).
元組
每條元組都以一個 int16 計數開頭,該計數是元組中字段的數目.(目前,在一個表
里的每條元組都有相同的計數,但可能不會永遠這樣.)然后后面不斷出現元組中的各
個字段,在字段數據后面可能跟著一個 int16 類型長度字.類型長度域是這樣解釋
的:
零
數據域是 NULL.沒有數據跟著.
> 0
數據域是定長數據類型.和類型長字相同的準確的 N 字節.
-1
數據域是變長的數據類型.下面四個字節是變長頭, 它包含包括其自身在內的所有值
長度.
< -1
保留為將來使用.
對于非 NULL 域,讀者可以檢查這個類型長度是否匹配目標列的長度.這樣就提供了一
種簡單但有用的檢查,核實該數據是否預期數據.
在數據域之間沒有對奇填充或者任何其它額外的數據.還要注意該格式并不區分一種數
據類型是傳值還是傳參.這些東西都是非常有意的:它們可能可以提高這些文件的移植
性(盡管位權重和浮點格式等問題可能仍然不能讓你進行跨機器移動二進制數據).
如果在傾倒中包括了 OID,那么該 OID 域立即跟在域計數字后面.它是一個普通的
域,只不過它沒有包括在域計數.但它包括類型長度 --- 這樣就允許我們不用花太多
的勁就可以處理 4 字節和 8 字節,并且如果某個家伙允許 OID 是可選的話,那么還
可以把 OID 顯示成 NULL.
文件尾
文件尾包括一個 int16 字減 1.這樣就很容易與一條元組的域計數字 相區分.
如果一個域計數字既不是 -1 也不是預期的字段的數目,那么讀者應該報錯.這樣就提
供了對丟失與數據的同步的額外的檢查.
用法
下面的例子把一個表拷貝到標準輸出, 使用豎直條(|)作為域分隔符:
COPY country TO stdout USING DELIMITERS '|'; 從一個 Unix 文件中拷貝數據到一
個表范圍中:
COPY country FROM '/usr1/proj/bray/sql/country_data'; 下面是一個可以從 stdin
中拷貝數據 到表中的例子(因此它在最后一行中有終止序列):
AF????? AFGHANISTANAL????? ALBANIADZ????? ALGERIAZM????? ZAMBIAZW
ZIMBABWE/. 請注意在這里每行里的空白實際上是一個 TAB.
下面的是同樣的數據,在一臺 Linux/i586 機器上以二進制形式輸出.這些數據是用
Unix 工具 od -c 過濾之后輸出的. 該表有三個域;第一個是 char(2),第二個是
text, 第三個是integer.所有的行在第三個域都是一個 null 值.
0000000?? P?? G?? B?? C?? O?? P?? Y /n 377 /r /n /0 004 003 002 0010000020
/0 /0 /0 /0 /0 /0 /0 /0 003 /0 377 377 006 /0 /0 /00000040?? A?? F 377 377
017 /0 /0 /0?? A?? F?? G?? H?? A?? N?? I?? S0000060?? T?? A?? N /0 /0 003 /0
377 377 006 /0 /0 /0?? A?? L 3770000100 377 /v /0 /0 /0?? A?? L?? B?? A?? N
I?? A /0 /0 003 /00000120 377 377 006 /0 /0 /0?? D?? Z 377 377 /v /0 /0 /0
A?? L0000140?? G?? E?? R?? I?? A /0 /0 003 /0 377 377 006 /0 /0 /0
Z0000160?? M 377 377 /n /0 /0 /0?? Z?? A?? M?? B?? I?? A /0 /0 0030000200 /0
377 377 006 /0 /0 /0?? Z?? W 377 377 /f /0 /0 /0?? Z0000220?? I?? M?? B?? A
B?? W?? E /0 /0 377 377 兼容性 SQL92?? 在 里沒有 COPY 語句.
----------------------------------------------------------------------------
----
CREATE AGGREGATE
CREATE AGGREGATE
Name
CREATE AGGREGATE? --? 定義一個新的聚集函數
Synopsis
CREATE AGGREGATE name ( BASETYPE = input_data_type,
SFUNC = sfunc, STYPE = state_type
[ , FINALFUNC = ffunc ]
[ , INITCOND = initial_condition ] )
輸入
name
要創建的聚集函數名.
input_data_type
本聚集函數要處理的基本數據類型. 對于不檢查輸入類型的聚集來說,這個參數可以
聲明為 ANY. (比如 count(*)).
sfunc
用于處理源數據列里的每一個輸入數據的狀態轉換函數名稱. 它通常是一個兩個參數
的函數,第一個參數的類型是 state_type 而第二個參數的類型是 input_data_type.
另外,對于一個不檢查輸入數據的聚集,該函數只接受一個類型為 state_type 的參
數. 不管是哪種情況,此函數必須返回一個類型為 state_type的值. 這個函數接受
當前狀態值和當前輸入數據條目,而返回下個狀態值.
state_type
聚集的狀態值的數據類型.
ffunc
在轉換完所有輸入域/字段后調用的最終處理函數.它計算聚集的結果. 此函數必須接
受一個類型為 state_type 的參數. 聚集的輸出數據類型被定義為此函數的返回類
型.如果沒有聲明 ffunc 則使用聚集結果的狀態值作為聚集的結果,而輸出類型為
state_type.
initial_condition
狀態值的初始設置(值).它必須是一個數據類型 state_type 可以接受的文本常量
值. 如果沒有聲明,狀態值初始為 NULL.
輸出
CREATE
命令執行成功的返回信息.
描述
CREATE AGGREGATE允許用戶或程序員通過定義新的聚集函數來擴展 PostgreSQL 的功
能.一些用于基本類型的聚集函數如 min(integer) 和 avg(double precision) 等已
經包含在基礎軟件包里了. 如果你需要定義一個新類型或需要一個還沒有提供的聚集
函數,這時便可用 CREATE AGGREGATE 來提供我們所需要的特性.
一個聚集函數是用它的名字和輸入數據類型來標識的. 如果兩個聚集的輸入數據不
同,它們可以有相同的名字.要避免沖突, 不要寫一個與聚集同名而且輸入函數也相
同的普通函數.
一個聚集函數是用一個或兩個普通函數做成的: 一個狀態轉換函數 sfunc, 和一個可
選的終計算函數 ffunc. 它們是這樣使用的:
sfunc( internal-state, next-data-item ) ---> next-internal-state
ffunc( internal-state ) ---> aggregate-value
PostgreSQL 創建一個類型為 stype的臨時變量. 它保存這個聚集的當前內部狀態.
對于每個輸入數據條目, 都調用狀態轉換函數計算內部狀態值的新數值.在處理完所
有數據后,調用一次最終處理函數以計算聚集的輸出值. 如果沒有最終處理函數,那
么將最后的狀態值當做返回值.
一個聚集函數還可能提供一個初始條件,也就是說, 所用的該內部狀態值的初始
值.這個值是作為類型 text 的數據域存儲在數據庫里的, 不過它們必須是狀態值數
據類型的合法的外部表現形式的常量. 如果沒有提供狀態,那么狀態值初始化為
NULL.
如果在 pg_proc 里該狀態轉換函數被定義為 "strict", 那么 NULL 輸入就不能調用
它.這個時候,帶有這樣的轉換函數的聚集執行起來的現象如下所述.NULL 輸入的值
被忽略(不調用此函數并且保留前一個 狀態值).如果初始狀態值是 NULL,那么由第
一個非 NULL 值替換該狀態值, 而狀態轉換函數從第二個非 NULL 的輸入值開始調
用.這樣做讓我們比較容易 實現象 max 這樣的聚集.請注意這種行為只是當
state_type 與 input_data_type 相同的時候才表現出來. 如果這些類型不同,你必
須提供一個非 NULL 的初始條件或者使用一個 非strice的狀態轉換函數.
如果狀態轉換函數不是 strict(嚴格)的, 那么它將無條件地為每個輸入值調用,并
且必須自行處理 NULL 輸入和 NULL 轉換值, 這樣就允許聚集的作者對聚集中的 NULL
有完全的控制.
如果終轉換函數定義為"strict",則如果最終狀態值是 NULL 時就不能調用它; 而是
自動輸出一個NULL的結果.(當然,這才是 strict 函數的正常特征.) 不管是那種
情況,終處理函數可以選擇返回 NULL.比如, avg 的終處理函數在零輸入記錄時就會
返回 NULL.
注意
使用 DROP AGGREGATE 刪除聚集函數.
CREATE AGGREGATE的參數可以以任何順序書寫,而不只是上面顯示的順序.
用法
請參考 PostgreSQL 程序員手冊 聚集函數章節的聚集函數部分獲取完整的例子.
兼容性 SQL92
CREATE AGGREGATE是 PostgreSQL 語言的擴展. 在 里沒有 CREATE AGGREGATE.
----------------------------------------------------------------------------
----
CREATE CONSTRAINT TRIGGER
CREATE CONSTRAINT TRIGGER
Name
CREATE CONSTRAINT TRIGGER? --? 定義一個新的約束觸發器
Synopsis
CREATE CONSTRAINT TRIGGER name
AFTER events ON
relation constraint attributes
FOR EACH ROW EXECUTE PROCEDURE func '(' args ')'
輸入
name
約束觸發器的名稱.
events
觸發該觸發器的事件范圍.
relation
被觸發的關系名稱.
constraint
實際的約束聲明.
attributes
約束屬性.
func(args)
觸發器處理所調用的函數.
輸出
CREATE CONSTRAINT
成功創建后的返回信息.
描述
CREATE CONSTRAINT TRIGGER被 CREATE/ALTER TABLE 內部使用以及被 pg_dump 用于創
建那些用于參考完整性的特殊的觸發器.
這條語句不是做一般用途用的.
----------------------------------------------------------------------------
----
CREATE DATABASE
CREATE DATABASE
Name
CREATE DATABASE? --? 創建新數據庫
Synopsis
CREATE DATABASE name
[ WITH [ LOCATION = 'dbpath' ]
[ TEMPLATE = template ]
[ ENCODING = encoding ] ]
輸入
name
要創建的數據庫名.
dbpath
在文件系統里存儲新數據庫的可選位置;用字串文本聲明. 或者用 DEFAULT 表示使用
缺省位置.
template
從哪個模板創建新數據庫,這是模板名.或者用 DEFAULT 使用缺省模板
(template1).
encoding
創建新數據庫用的多字節編碼方法.聲明一個字串文本名字 (比如,'SQL_ASCII'),
或者一個整數編號,或者是 DEFAULT 表示使用缺省編碼.
輸出
CREATE DATABASE
命令成功執行的返回信息.
ERROR: user 'username' is not allowed to create/drop databases
你必須有特殊的 CREATEDB 權限來創建數據庫。參閱 See CREATE USER。
ERROR: createdb: database "name" already exists
如果聲明的數據庫 name 已經存在返回的信息.
ERROR: database path may not contain single quotes
數據庫路徑名 dbpath 不能包含單引號。這樣要求是為了創建數據庫目錄的 shell 命
令能夠正確執行。
ERROR: CREATE DATABASE: may not be called in a transaction block
如果你有一個明確的事務塊正在處理,你不能調用 CREATE DATABASE。你必須先結束事
務。
ERROR: Unable to create database directory 'path'.
ERROR: Could not initialize database directory.
這種情況最有可能是因為對數據目錄權限不夠, 磁盤已滿或其他文件系統問題。數據
庫服務器運行的機器上的用戶必 須能訪問該路徑。
描述
CREATE DATABASE創建一個新的 PostgreSQL 數據庫.創建者成為新數據庫的管理員.
可以聲明一個可選的數據庫位置,例如,在另一塊硬盤上存放數據庫。 該路徑必須是
事先用 initlocation命令準備好了的.
如果路徑名不包含斜杠,那么它被解釋成一個環境變量, 該變量必須為服務進程所
知。這樣數據庫管理員 可以對能夠在那里創建數據庫進行控制。(例如,一個用戶化
的選擇是 'PGDATA2'。)如果服務器帶著 ALLOW_ABSOLUTE_DBPATHS (缺省時沒有)選
項編譯,那么也允許使用以斜杠開頭為標識的絕對路徑(例如, '
'/usr/local/pgsql/data')。
缺省時,新數據庫將通過克隆標準系統數據庫 template1 來創建.不同的模板可以用
TEMPLATE = name 來寫.尤其是,如果你用 TEMPLATE = template0, 你可以創建一個
很純凈的數據庫,只包括你的版本的 PostgreSQL 預定義的標準對象.這個方法可以避
免把任何已經加入到template1 里的本地安裝對象拷貝到新數據庫.
可選的編碼參數允許選擇數據庫編碼, 如果你的服務器是帶著多字節編碼支持編譯的
話. 如果沒有聲明,缺省是所選用的模板數據庫用的編碼.
可選參數可以以任意順序寫,而不僅是上面顯示的順序.
注意
CREATE DATABASE是 PostgreSQL 語言的擴展.
使用 DROP DATABASE刪除一個數據庫.
程序 createdb是 是這個命令的 shell 腳本的封裝,提供來方便使用。
在用絕對路徑指定的可選數據庫位置時, 有一些安全和數據完整性的問題, 而且缺省
時只有后端識別的環境變量可以聲明為可選的路徑.參考管理員手冊獲取更多的信息.
盡管我們可以通過把某數據庫名聲明為模板從非template1數據庫拷貝數據庫,但是這
(還)不是一個通用的 COPY DATABASE 功能. 因此,我們建議當做模板使用的數據庫
都應該是以只讀方式對待的.參閱管理員手冊獲取更多信息.
用法
創建一個新的數據庫:
olly=> create database lusiadas;
在另一個地方 ~/private_db創建新數據庫:
$ 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 語句. 數據庫等同于目錄,其創建是由實現決定的.
----------------------------------------------------------------------------
----
CREATE FUNCTION
CREATE FUNCTION
Name
CREATE FUNCTION? --? 定義一個新函數
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定義一個新的函數. CREATE OR REPLACE FUNCTION 將要么創建一個
新函數,要么替換現有的定義.
參數
name
要創建的函數名字.這個名字可以不是唯一的, 因為函數可以重載,膽識同名的函數
必須有不同的參數類型.
argtype
該函數的數據類型(如果有).輸入類型可以是基本類型,也可以是復合類型,opaque,
或者和一個現有字段相同的類型. Opaque 表示該函數接受非 SQL 類型,比如 char
*. 一個字段的類型是用 tablename.columnname%TYPE 表示的;使用這個東西可以幫
助函數獨立于表定義的修改.
rettype
返回數據類型.輸出類型可以聲明為一個基本類型,復合類型, setof 類型,
opaque, 或者和現有字段同類型. setof 修飾詞表示該函數將返回一套條目,而不是
一條條目.返回類型聲明為 opaque 的函數不返回數值.它們不能直接調用;觸發器函
數可以利用這個 特性.
definition
一個定義函數的字串;含義取決于語言.它可以是一個內部函數名字, 一個指向某個
目標文件的路徑,一個 SQL 查詢,或者一個用過程語言 寫的文本.
obj_file, link_symbol
這個形式的 AS 子句用于在函數的 C 源文件 名字和 SQL 函數的名字不同的時候動態
聯接 C 語言函數. 字串 obj_file 是包含可動態裝載的對象的文件名,而
link_symbol 是對象的聯接符號,也就是該函數在 C 源文件列的名字.
langname
可以是 SQL,C, internal,或者 plname,這里的 plname 是一種已創建過程語言的
名字. 參閱 CREATE LANGUAGE獲取細節. 為了保持向下兼容,該名字可以用單引號包
圍.
attribute
一段可選的有關該函數的信息,用于優化.見下文獲取細節.
創建該函數的用戶成為該函數所有者.
下面的屬性可以出現在 WITH 子句里∶
iscachable
Iscachable 表示此函數在輸入相同時總是返回相同的值 (也就是說, 它不做數據庫
查找或者是使用沒有直接在它的參數列表出現的信息)。 優化器使用 iscachable 來
認知對該函數的調用進行預先計算是否安全。
isstrict
isstrict 表明如果它的任何參數是 NULL,此函數總是返回 NULL. 如果聲明了這個屬
性,則如果存在 NULL 參數時不會執行該函數; 而只是自動假設一個 NULL 結果.如
果沒有聲明 isstrict 該函數將為 NULL 輸入調用并進行處理. 那么剩下的事就是函
數作者的責任來檢查 NULL 是否必須并且做相應響應.
注意
請參閱 PostgreSQL 程序員手冊 關于通過函數擴展 PostgreSQL 的章節獲取更多關于
書寫外部函數的信息.
我們允許你將完整的 SQL 類型語法用于 輸入參數和返回值.不過,有些類型聲明的細
節(比如, numeric 類型的精度域)是由下層函數實現負責的, 并且會被 CREATE
FUNCTION 命令悄悄地吞掉. (也就是說,不再被識別或強制).
PostgreSQL 允許函數 重載;也就是說,同一個函數名可以用于幾個不同的函數, 只
要它們的參數可以區分它們。不過,這個功能在用于 internal(內部)和 C 語言 的函
數時要小心。
兩個 internal 函數擁有相同 C 名稱時肯定會發生鏈接時錯誤。 要解決這個問題,給
它們賦予不同的 C 名稱(例如,使用參數類型做為 C 名稱的一部分),然后在
CREATE FUNCTION 的 AS 子句里面聲明這些名字。 如果 AS 子句為空,那么 CREATE
FUNCTION 假設函數的 C 名稱與SQL名稱一樣。
類似的還有,如果用多個 C 語言函數重載 SQL 函數, 給每個 C 語言函數的實例一個
獨立的名稱,然后使用 CREATE FUNCTION 語法里的 AS 句的不同形式來選擇每個重載
的 SQL 函數的正確的 C 語言實現.
如果重復調用 CREATE FUNCTION,并且都指向同一個目標文件,那么該文件只裝載一
次.要卸載和恢復裝載 該文件(可能是在開發過程中),你可以使用 LOAD命令.
使用 DROP FUNCTION 刪除一個用戶定義函數.
要更新現存函數的定義,用 CREATE OR REPLACE FUNCTION.請注意不可能用這種方法
改變一個函數的名字或者參數類型 (如果你這么干,你只是會創建一個新的,不同的函
數). 同樣,CREATE OR REPLACE FUNCTION 也不會 讓你改變一個現存函數的返回類
型.要干這些事,你必須刪除并 重新創建該函數.
如果你刪除然后重新創建一個函數,新函數和舊的并非相同實體; 你會破壞現存的引
用了原有函數的規則,視圖,觸發器等等.使用 CREATE OR REPLACE FUNCTION 可以改
變一個函數的定義而又不會破壞引用該函數的對象.
例子
要創建一個簡單的 SQL 函數∶
CREATE FUNCTION one() RETURNS integer
AS 'SELECT 1 AS RESULT;'
LANGUAGE SQL;
SELECT one() AS answer;
answer
--------
1
這個例子通過調用一個用戶創建的名為 funcs.so (擴展名因平臺而異)的共享庫過程創
建一個 C 函數. 該共享庫文件應該位于服務器的動態搜索路徑里.該路徑計算一個檢
測位并且如果函數參數里的檢測位 正確就返回一個 TRUE .這些可以通過用一個
CHECK 約束實現的.
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))
);
這個例子創建一個在用戶定義類型 complex 和內部類型 point 之間做類型轉換的函
數。該函數是用一個從 C 源代碼編譯的 動態裝載的對象來實現的。(我們演示了使用
聲明共享目標文件 的準確路徑名的過時方法). 對于 PostgreSQL 而言, 要自動尋找
類型轉換函數,SQL 函數必須和返回類型同名,因而重載是不可避免的。 該函數名通
過使用 SQL定義里 AS 子句的第二種類型來重載:
CREATE FUNCTION point(complex) RETURNS point
AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
LANGUAGE C;
該函數的 C 聲明可以是∶
Point * complex_to_point (Complex *z)
{
Point *p;
p = (Point *) palloc(sizeof(Point));
p->x = z->x;
p->y = z->y;
return p;
}
兼容性 SQL92
在 SQL99 里的確定義了一個CREATE FUNCTION PostgreSQL 的和它類似但是不兼容.這
個屬性是不可移植的,可以使用的不同語言也是如此.
又見
DROP FUNCTION , LOAD, PostgreSQL程序員手冊
----------------------------------------------------------------------------
----
CREATE FUNCTION
Name
CREATE FUNCTION? --? 定義一個新函數
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定義一個新的函數. CREATE OR REPLACE FUNCTION 將要么創建一個
新函數,要么替換現有的定義.
參數
name
要創建的函數名字.這個名字可以不是唯一的, 因為函數可以重載,膽識同名的函數
必須有不同的參數類型.
argtype
該函數的數據類型(如果有).輸入類型可以是基本類型,也可以是復合類型,opaque,
或者和一個現有字段相同的類型. Opaque 表示該函數接受非 SQL 類型,比如 char
*. 一個字段的類型是用 tablename.columnname%TYPE 表示的;使用這個東西可以幫
助函數獨立于表定義的修改.
rettype
返回數據類型.輸出類型可以聲明為一個基本類型,復合類型, setof 類型,
opaque, 或者和現有字段同類型. setof 修飾詞表示該函數將返回一套條目,而不是
一條條目.返回類型聲明為 opaque 的函數不返回數值.它們不能直接調用;觸發器函
數可以利用這個 特性.
definition
一個定義函數的字串;含義取決于語言.它可以是一個內部函數名字, 一個指向某個
目標文件的路徑,一個 SQL 查詢,或者一個用過程語言 寫的文本.
obj_file, link_symbol
這個形式的 AS 子句用于在函數的 C 源文件 名字和 SQL 函數的名字不同的時候動態
聯接 C 語言函數. 字串 obj_file 是包含可動態裝載的對象的文件名,而
link_symbol 是對象的聯接符號,也就是該函數在 C 源文件列的名字.
langname
可以是 SQL,C, internal,或者 plname,這里的 plname 是一種已創建過程語言的
名字. 參閱 CREATE LANGUAGE獲取細節. 為了保持向下兼容,該名字可以用單引號包
圍.
attribute
一段可選的有關該函數的信息,用于優化.見下文獲取細節.
創建該函數的用戶成為該函數所有者.
下面的屬性可以出現在 WITH 子句里∶
iscachable
Iscachable 表示此函數在輸入相同時總是返回相同的值 (也就是說, 它不做數據庫
查找或者是使用沒有直接在它的參數列表出現的信息)。 優化器使用 iscachable 來
認知對該函數的調用進行預先計算是否安全。
isstrict
isstrict 表明如果它的任何參數是 NULL,此函數總是返回 NULL. 如果聲明了這個屬
性,則如果存在 NULL 參數時不會執行該函數; 而只是自動假設一個 NULL 結果.如
果沒有聲明 isstrict 該函數將為 NULL 輸入調用并進行處理. 那么剩下的事就是函
數作者的責任來檢查 NULL 是否必須并且做相應響應.
注意
請參閱 PostgreSQL 程序員手冊 關于通過函數擴展 PostgreSQL 的章節獲取更多關于
書寫外部函數的信息.
我們允許你將完整的 SQL 類型語法用于 輸入參數和返回值.不過,有些類型聲明的細
節(比如, numeric 類型的精度域)是由下層函數實現負責的, 并且會被 CREATE
FUNCTION 命令悄悄地吞掉. (也就是說,不再被識別或強制).
PostgreSQL 允許函數 重載;也就是說,同一個函數名可以用于幾個不同的函數, 只
要它們的參數可以區分它們。不過,這個功能在用于 internal(內部)和 C 語言 的函
數時要小心。
兩個 internal 函數擁有相同 C 名稱時肯定會發生鏈接時錯誤。 要解決這個問題,給
它們賦予不同的 C 名稱(例如,使用參數類型做為 C 名稱的一部分),然后在
CREATE FUNCTION 的 AS 子句里面聲明這些名字。 如果 AS 子句為空,那么 CREATE
FUNCTION 假設函數的 C 名稱與SQL名稱一樣。
類似的還有,如果用多個 C 語言函數重載 SQL 函數, 給每個 C 語言函數的實例一個
獨立的名稱,然后使用 CREATE FUNCTION 語法里的 AS 句的不同形式來選擇每個重載
的 SQL 函數的正確的 C 語言實現.
如果重復調用 CREATE FUNCTION,并且都指向同一個目標文件,那么該文件只裝載一
次.要卸載和恢復裝載 該文件(可能是在開發過程中),你可以使用 LOAD命令.
使用 DROP FUNCTION 刪除一個用戶定義函數.
要更新現存函數的定義,用 CREATE OR REPLACE FUNCTION.請注意不可能用這種方法
改變一個函數的名字或者參數類型 (如果你這么干,你只是會創建一個新的,不同的函
數). 同樣,CREATE OR REPLACE FUNCTION 也不會 讓你改變一個現存函數的返回類
型.要干這些事,你必須刪除并 重新創建該函數.
如果你刪除然后重新創建一個函數,新函數和舊的并非相同實體; 你會破壞現存的引
用了原有函數的規則,視圖,觸發器等等.使用 CREATE OR REPLACE FUNCTION 可以改
變一個函數的定義而又不會破壞引用該函數的對象.
例子
要創建一個簡單的 SQL 函數∶
CREATE FUNCTION one() RETURNS integer
AS 'SELECT 1 AS RESULT;'
LANGUAGE SQL;
SELECT one() AS answer;
answer
--------
1
這個例子通過調用一個用戶創建的名為 funcs.so (擴展名因平臺而異)的共享庫過程創
建一個 C 函數. 該共享庫文件應該位于服務器的動態搜索路徑里.該路徑計算一個檢
測位并且如果函數參數里的檢測位 正確就返回一個 TRUE .這些可以通過用一個
CHECK 約束實現的.
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))
);
這個例子創建一個在用戶定義類型 complex 和內部類型 point 之間做類型轉換的函
數。該函數是用一個從 C 源代碼編譯的 動態裝載的對象來實現的。(我們演示了使用
聲明共享目標文件 的準確路徑名的過時方法). 對于 PostgreSQL 而言, 要自動尋找
類型轉換函數,SQL 函數必須和返回類型同名,因而重載是不可避免的。 該函數名通
過使用 SQL定義里 AS 子句的第二種類型來重載:
CREATE FUNCTION point(complex) RETURNS point
AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
LANGUAGE C;
該函數的 C 聲明可以是∶
Point * complex_to_point (Complex *z)
{
Point *p;
p = (Point *) palloc(sizeof(Point));
p->x = z->x;
p->y = z->y;
return p;
}
兼容性 SQL92
在 SQL99 里的確定義了一個CREATE FUNCTION PostgreSQL 的和它類似但是不兼容.這
個屬性是不可移植的,可以使用的不同語言也是如此.
又見
DROP FUNCTION , LOAD, PostgreSQL程序員手冊
----------------------------------------------------------------------------
----
CREATE GROUP
CREATE GROUP
Name
CREATE GROUP? --? 定義一個新的用戶組
Synopsis
CREATE GROUP name [ [ WITH ] option [ ... ] ]
這里 option 可以是∶
SYSID gid
| USER username [, ...]
輸入
name
組名。
gid
SYSID 子句可以用于選擇 PostgreSQL 里新組的組標識(group id)。 不過,這樣做
不是必須的。
如果沒有聲明這個,將使用從 1 開始的,已分配的最高組標識加一作為缺省值。
username
包括到組里面的用戶列表。用戶必須已經存在。
輸出
CREATE GROUP
成功創建組后的返回。
描述
CREATE GROUP 將在數據庫節點上創建一個新組。參考管理員手冊獲取關于使用組來認
證的信息。 要使用這條命令, 你必須是數據庫超級用戶。
使用 ALTER GROUP修改組成員,DROP GROUP刪除一個組。
用法
創建一個空組:
CREATE GROUP staff
創建一個有成員的組:
CREATE GROUP marketing WITH USER jonathan, david
兼容性 SQL92
里沒有 CREATE GROUP 。Roles 在概念上與組類似。
----------------------------------------------------------------------------
----
CREATE LANGUAGE
CREATE LANGUAGE
Name
CREATE LANGUAGE -- 定義一種新的過程語言
Synopsis
CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE langname
HANDLER call_handler
描述
使用 CREATE LANGUAGE, 一個PostgreSQL 用戶可以在 PostgreSQL里注冊一個新的語
言.因而,函數和觸發器過程可以用這種新語言定義.要注冊新 語言用戶必須具有
PostgreSQL 超級用戶權限.
CREATE LANGUAGE將該語言的名字和一個調用句柄 關聯起來,而該調用句柄負責執行該
語言書寫的函數.請參考程序員手冊獲取有關語言調用句柄的 更多信息.
請注意過程語言是對每個獨立的數據庫而言是自己的. 要讓一種語言缺省時可以為所
有數據庫獲得,那你應該把它安裝到 template1 數據庫里.
參數
TRUSTED
TRUSTED 說明對該語言的調用句柄是安全的;也就是說,它不會提供給非特權用戶任何
繞過訪問限制的能力. 如果忽略這個關鍵字,只有具有 PostgreSQL 超級用戶權限的
人可以使用這個語言創建新的函數.
PROCEDURAL
這是個沒有用的字.
langname
新的過程化語言的名稱.語言名是大小寫無關的. 一個過程化語言不能覆蓋
PostgreSQL內置的語言.
出于向下兼容的原因,這個名字可以用單引號包圍.
HANDLER call_handler
call_handler是一個以前注冊過的函數的名字,該函數將被調用來執行這門過程語言寫
的函數.過程語言的調用句柄必須用一種編譯語言書寫,比如 C,調用風格必須 是版
本 1 的調用風格,并且在 PostgreSQL 里注冊為不接受參數并且返回 opaque 類型的
函數, (opaque 是用于未聲明或未定義類型的占位符). undefined types.
診斷
CREATE
如果語言成功創建,返回此信息.
ERROR: PL handler function funcname() doesn't exist
如果沒有找到函數 funcname(), 則返回此信息.
注意
這條命令通常不應該由用戶直接執行. 對于 PostgreSQL 版本里提供的過程語言,我
們應該使用 createlang腳本, 它將為我們安裝正確的調用句柄. (createlang 也會
在內部調用 CREATE LANGUAGE.)
使用 CREATE FUNCTION 命令創建新函數.
使用 DROP LANGUAGE,或者更好是 droplang腳本刪除一個過程語言.
系統表 pg_language 記錄了更多有關 當前安裝的過程語言的信息.
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
目前,一種過程語言創建之后它的定義就不能再更改.
例子
下面兩條順序執行的命令將注冊一門新的過程語言及其關聯的調用句柄.
CREATE FUNCTION plsample_call_handler () RETURNS opaque
AS '$libdir/plsample'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;
兼容性 SQL92
CREATE LANGUAGE是 PostgreSQL 擴展.
歷史
CREATE LANGUAGE命令第一次出現在 PostgreSQL 6.3.
又見
createlang, CREATE FUNCTION , droplang, DROP LANGUAGE, PostgreSQL 程序員手冊
----------------------------------------------------------------------------
----
CREATE OPERATOR
CREATE OPERATOR
Name
CREATE OPERATOR? --? 定義一個新的操作符
Synopsis
CREATE OPERATOR name ( PROCEDURE = func_name
[, LEFTARG = lefttype
] [, RIGHTARG = righttype ]
[, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
[, RESTRICT = res_proc ] [, JOIN = join_proc ]
[, HASHES ] [, SORT1 = left_sort_op ] [, SORT2 = right_sort_op ] )
輸入
name
要定義的操作符。可用的字符見下文。
func_name
用于實現該操作符的函數。
lefttype
如果存在的話,操作符左手邊的參數類型. 如果是左目操作符,這個參數可以省略。
righttype
如果存在的話,操作符右手邊的參數類型. 如果是右目操作符,這個參數可以省略。
com_op
該操作符對應的交換(commutator)操作符。
neg_op
對應的負操作符。
res_proc
此操作符約束選擇性計算函數。
join_proc
此操作符連接選擇性計算函數。
HASHES
表明此操作符支持哈希(散列)連接。
left_sort_op
如果此操作符支持融合連接(join),此操作符的左手邊數據的排序操作符。
right_sort_op
如果此操作符支持融合連接(join),此操作符的右手邊數據的排序操作符。
輸出
CREATE
成功創建操作符后的返回信息.
描述
CREATE OPERATOR定義一個新的操作符, name. 定義該操作符的用戶成為其所有者.
操作符 name 是一個最多NAMEDATALEN-1 長的(缺省為 31 個)下列字符組成的字串:
+ - * / < > = ~ ! @ # % ^ & | ` ? $
你選擇名字的時候有幾個限制:
"$" 和 ":" 不能定義為單字符操作符, 但是它們可以是一個多字符操作符的名稱的一
部分.
"--" 和 "/*" 不能在操作符名字的任何地方出現, 因為它們會被認為是一個注釋的開
始.
一個多字符的操作符名字不能以 "+" 或 "-" 結尾, 除非該名字還包含至少下面字符
之一:
~ ! @ # % ^ & | ` ? $
例如, @- 是一個允許的操作符名, 但 *- 不是. 這個限制允許 PostgreSQL 分析
SQL-有問題的查詢而不要求在符號之間有空白.
注意: 當使用非 SQL-標準操作符名時, 你通常將需要用空白把聯接的操作符分離開以
避免含混.例如,如果你定義了一個左目操作符,名為 "@",你不能寫 X*@Y;你必須
寫成 X* @Y 以保證 PostgreSQL 把它讀做兩個操作符而不是一個.
操作符 "!=" 在輸入時映射成 "<>", 因此這兩個名稱總是相等的.
至少需要定義一個 LEFTARG 或 RIGHTARG. 對于雙目操作符來說,兩者都需要定義.
對右目操作符來說,只需要定義 LEFTARG, 而對于左目操作符來說,只需要定義
RIGHTARG.
同樣, func_name 過程必須已經用 CREATE FUNCTION 定義過, 而且必須定義為接受
正確數量的指定類型參數(一個或是兩個).
如果存在換向操作符則必須指明,這樣 PostgreSQL 可以按它的意愿轉換操作符的方
向.例如,操作符面積小于, <<<, 很有可能有一個轉換操作符:面積大于操作符,
>>>. 因此,查詢優化器可以自由的將下面查詢從:
box '((0,0), (1,1))' >>> MYBOXES.description
轉換到
MYBOXES.description <<< box '((0,0), (1,1))'
這就允許執行代碼總是使用后面的形式而某種程度上簡化了查詢優化器.
類似地,如果存在負號操作符則也應該聲明。 假設一個操作符,面積相等, ===,存
在,同樣有一個面積不等操作符, !==. 負號操作符允許查詢優化器將
NOT MYBOXES.description === box '((0,0), (1,1))'
簡化成
MYBOXES.description !== box '((0,0), (1,1))'
如果提供了一個交換操作符名稱, PostgreSQL 將在表中查找它.如果找到,而且其本
身沒有一個交換符,那么交換符表將被更新,以當前(最 新)創建的操作符作為它的
交換符.這一點一樣適用于負號操作符. 這就允許定義兩個互為交換符或負號符的操
作符.第一個操作符應該定義為沒有交換符 或負號符(as appropriate). 當定義第
二個操作符時,將第一個符號作為交換符或負號符.第一個將因上述的副作用一樣被更
新(而獲得交換符 或負號符).(對于PostgreSQL 6.5, 把兩個操作符指向對方同樣
也行。)
HASHES,SORT1 和 SORT2 選項將為查詢優化器進行連接查詢時提供支持.
PostgreSQL 能夠總是用反復替換來計算一個連接(也就是說,處理這樣的子句,該子
句有兩個元組變量, 這兩個變量被一個操作符分開,這個操作符返回一個boolean量)
[WONG76]. 另外, PostgreSQL 可以延著 [SHAP86]實現一個散列-連接算法
(hash-join algorithm);但是,我們必須知道這個策略是否可行.目前的散列-連
接算法只是對代表相等 測試的操作符有效;而且,數據類型的相等必須意味著類型的
表現是按位相等的。 (例如,一個包含未用的位的數據類型,這些位對相等測試沒有
影響,但卻不能用于哈希連接。)HASHES 標記告訴優化器, 對這個操作符可以安全地
使用哈希連接。
類似的,兩目排序操作符告訴查詢優化器一個融合-排序 (merge-sort)是否是一個
可用的連接策略,并且告訴優化器使用哪個操作符來對這兩個操 作數表排序.排序操
作符應該只提供給相等操作符, 并且它們應該對應用于相應的左邊和右邊數據類型的
小于操作符。
如果發現有其他聯合策略可用, PostgreSQL 將更改優化器和運行時系統以利用這些策
略,并且在定義一個操作符時將需要更多的聲明.幸運的是,研究 團隊不經常發明新
的聯合策略, 而且增加用戶定義聯合策略的方法看來與其實現的復雜性相比是不值得
的。
RESTRICT 和 JOIN 選項幫助優化器計算結果的尺寸大小.如果像下面的語句:
MYBOXES.description <<< box '((0,0),(1,1))'
在判斷條件中出現,那么 PostgreSQL 將不得不估計 MYBOXES 中滿足該子句的記錄數
量的范圍的大小. 函數 res_proc 必需是一個注冊過的函數(也就是說它已經用
CREATE FUNCTION定義過了),它接受一個正確數據的數據類型作為參數,返回一個浮
點數. 查詢優化器只是簡單的調 用這個函數,將參數 ((0,0),(1,1)) 傳入并且把結
果乘以關系(表)尺寸以獲得所需要的記錄的數值。
類似的,當操作符的兩個操作數都包含記錄變量時, 優化器必須計算聯合結果的尺
寸. 函數 join_proc 將返回另一個浮點數,這個數就是將兩個表相關 的記錄相乘,
計算出預期結果的尺寸.
函數
my_procedure_1 (MYBOXES.description, box '((0,0), (1,1))')
和操作符
MYBOXES.description === box '((0,0), (1,1))'
之間的區別是 PostgreSQL 試圖優化操作符并且可以決定使用索引來縮小相關操作符的
搜索區間.但是,對函數將不會有任何優化的動作,而且是強制 執行.最后,函數可
有任意個參數,而操作符限于一個或兩個.
注意
請參閱 PostgreSQL 用戶手冊 中操作符章節獲取更多信息.請使用 DROP OPERATOR 從
數據庫中刪除用戶定義操作符.
用法
下面命令定義一個新操作符,面積相等,用于 BOX 數據類型.
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 擴展. 在中沒有 CREATE OPERATOR 語句.
----------------------------------------------------------------------------
----
CREATE RULE
CREATE RULE
Name
CREATE RULE? --? 定義一個新的重寫規則
Synopsis
CREATE RULE name AS ON event
TO object [ WHERE condition ]
DO [ INSTEAD ] action
這里 action 可以是:
NOTHING
|
query
|
( query ; query ... )
|
[ query ; query ... ]
輸入
name
創建的規則名.
event
事件是 SELECT, UPDATE,DELETE 或 INSERT 之一.
object
對象是 table 或 table.column.(目前只有 table 形式實際上是實現了的.
condition
任意 SQL 布爾條件表達式.條件表達式除了引用 new 和 old 之外不能引用任何表.
query
組成 action 的查詢可以是任何 SQL SELECT,INSERT, UPDATE,DELETE,或 NOTIFY
語句之一.
在 condition 和 action 里,特殊表名字 new 和 old 可以用于指向引用表 (
object) 里的數值 new 在 ON INSERT 和 ON UPDATE 規則里 可以指向被插入或更新
的新行. old 在 ON UPDATE,和 ON DELETE 規則里可以指向現存的被更新,或者刪除
的行.
輸出
CREATE
成功創建規則后的返回信息.
描述
PostgreSQL 規則系統 允許我們在從數據庫或表中更新, 插入或刪除東西時定義一個
可選的動作來執行。目前,規則用于實現表視圖。
規則的語意是在一個單獨的記錄正被訪問,更新,插入或刪除時, 將存在一個舊記錄
(用于檢索,更新和刪除)和一個新記錄 (用于更新和追加).這時給定事件類型和
給定目標對象(表)的所有規則都將被檢查, (順序不定). 如果在 WHERE (如果
有)子句里面所聲明的 condition? 為真,那么 action 部分的規則就被執行. 如果
聲明了 INSTEAD,那么 action 就會代替原來的查詢;否則,如果是 ON INSERT 那么
它在原來的查詢之后執行,如果是 ON UPDATE 或者 ON DELETE,那么它在原來的查詢
之前執行.在 condition 和 action 里面, 在舊記錄里字段的數值和/或新記錄里字
段的數值被 old. attribute-name 和 new. attribute-name 代替.
規則的 action 部分可以由一條或者多條查詢組成.要寫多個查詢,用圓括弧或者方括
弧 把它們包圍起來. 這樣的查詢將以聲明的順序執行(只是我們不能保證對一個對象
的多個規則的執行順序). action 還可以是 NOTHING 表示沒有動作.因此,一個 DO
INSTEAD NOTHING 規則制止了原來的查詢的運行(當條件為真時); DO NOTHING 規則
是沒有用的.
規則的 action 部分 執行的時候帶有和觸發動作的用戶命令相同的命令和事務標識
符.
規則和視圖
目前,ON SELECT 規則必須是無條件的 INSTEAD 規則并且 必須有一個由一條 SELECT
查詢組成的動作.因此,一條 ON SELECT 規則有效地把對象表轉成視圖,它的可見內
容 是規則的 SELECT 查詢返回的記錄而不是存儲在表中的內容(如果有的話). 我們
認為寫一條 CREATE VIEW 命令比創建一個表然后定義一條 ON SELECT 規則在上面的風
格要好.
CREATE VIEW 創建一個虛擬表(沒有下層的存儲) 以及相關的 ON SELECT 規則.系統不
允許對視圖進行更新, 因為它知道在視圖上沒有真正的表.你可以創建一個可以更新
的視圖的幻覺, 方法是在視圖上定義 ON INSERT,ON UPDATE,和 ON DELETE 規則
(或者滿足你需要的任何上述規則的子集),用合適的對其它表的更新替換 在視圖上更
新的動作.
如果你想在視圖更新上使用條件規則,那么這里就有一個補充∶ 對你希望在視圖上允
許的每個動作,你都必須有一個無條件的 INSTEAD 規則.如果規則是有條件的,或者
它不是 INSTEAD, 那么系統仍將拒絕執行更新動作的企圖,因為它認為它最終會在某
種 程度上在虛擬表上執行動作. 如果你想處理條件規則上的所由有用的情況,那也可
以;只需要增加一個無條件的 DO INSTEAD NOTHING 規則確保系統明白它將決不會被
調用來更新虛擬表就可以了.然后把條件規則做成非 INSTEAD; 在這種情況下,如果
它們被觸發,那么它們就增加到缺省的 INSTEAD NOTHING 動作中.
注意
為了在表上定義規則,你必須有規則定義權限. 用 GRANT 和 REVOKE 修改權限.
有一件很重要的事情是要避免循環規則. 比如,盡管下面兩條規則定義都是
PostgreSQL 可以接受的, select 命令會導致 PostgreSQL 報告 一條錯誤信息,因為
該查詢循環了太多次:
CREATE RULE bad_rule_combination_1 AS
ON SELECT TO emp
DO INSTEAD
SELECT * FROM toyemp;
CREATE RULE bad_rule_combination_2 AS
ON SELECT TO toyemp
DO INSTEAD
SELECT * FROM emp;
下面這個對 EMP 的查詢企圖將導致 PostgreSQL 產生一個錯誤信息, 因為該查詢循環
了太多次:
SELECT * FROM emp;
目前,如果一個規則包含一個 NOTIFY 查詢,那么該 NOTIFY 將被 無條件執行 --- 也
就是說,如果規則不施加到任何行上頭,該 NOTIFY 也會被發出.比如,在
CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable;
UPDATE mytable SET name = 'foo' WHERE id = 42;
里,一個 NOTIFY 事件將在 UPDATE 的時候發出,不管是否有某行的 id = 42.這是一
個實現的限制,將來的版本應該修補這個毛病.
兼容性 SQL92
CREATE RULE語句是 PostgreSQL 語言的擴展. 在里沒有CREATE RULE 語句.
----------------------------------------------------------------------------
----
CREATE SEQUENCE
CREATE SEQUENCE
Name
CREATE SEQUENCE? --? 創建一個新的序列發生器
Synopsis
CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT increment ]
[ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
[ START start ] [ CACHE cache ] [ CYCLE ]
輸入
TEMPORARY 或 TEMP
如果聲明了這個修飾詞,那么該序列對象只為這個會話創建, 并且在會話結束的時候
自動刪除.在臨時序列存在的時候, 同名永久序列是不可見的(在同一會話里).
seqname
將要創建的序列號名.
increment
INCREMENT increment 子句是可選的.一個正數將生成一個遞增的序列, 一個負數將
生成一個遞減的序列.缺省值是一(1).
minvalue
可選的子句 MINVALUE minvalue 決定一個序列可生成的最小值.缺省分別是遞增序列
為 1 遞減為 -2^63-1.
maxvalue
使用可選子句 MAXVALUE maxvalue 決定序列的最大值.缺省的分別是遞增為
-2^63-1,遞減為 -1.
start
可選的 START start 子句 使序列可以從任意位置開始.缺省初始值是遞增序列為
minvalue 遞減序列為 maxvalue.
cache
CACHE cache 選項使序列號預分配并且為快速訪問存儲在內存里面. 最小值(也是缺
省值)是1(一次只能生成一個值, 也就是說沒有緩存).
CYCLE
可選的 CYCLE 關鍵字可用于使序列到達 最大值(maxvalue) 或 最小值(minvalue)
時可復位并繼續下去.如果達到極限,生成的下一個數據將分別是 最小值
(minvalue) 或 最大值(maxvalue).如果沒有 CYCLE,那么在到達極限之后再調用
nextval 將返回錯誤.
輸出
CREATE
命令成功執行的返回信息.
ERROR: Relation 'seqname' already exists
如果聲明的序列已經存在.
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將向當前數據庫里增加一個新的序列號生成器. 包括創建和初始化一
個新的名為 seqname的 單行表.生成器將為使用此命令的用戶"所有".
在序列創建后,你可以使用函數 nextval, currval 和 nextval 操作序列.這些函數
在用戶手冊中有詳細文檔.
盡管你不能直接更新一個序列,但你可以使用象
SELECT * FROM seqname;
檢查一個序列的參數和當前狀態.特別是序列的 last_value 字段顯示了任意后端進程
分配的最后的數值. (當然,這些值在被打印出來的時候可能已經過時了 --- 如果其
它進程 正積極地使用 nextval.)
Caution
如果用語序列對象的cache 設置大于一, 而且該對象可能被多個后端同時使用就有可
能產生不可預料的結果.每個后端 在訪問過序列對象并遞增序列對象的 last_value
后, 將分配跟在序列值后面"緩存數".這樣,該后端在下面的 cache-1 次nextval調
用將使用預分配好的數值, 而不對共享對象做任何更新. 所以,任何已經分配但在會
話中沒有使用的數字 將在會話結束時丟失.而且,盡管多個后端保證分配獨立的序列
值, 當考慮所有的后端時該數值卻有可能是亂序的.(例如,設置 cache為10, 后端
A 可能保留數值 1..10 并且返回nextval=1, 而后端 B 可能保留數值 11..20 并在后
端 A 生成nextval=2 之 前返回 nextval=11.)因此, 將cache 設為一可以安全地假
設nextval的數值是順序生成的; 當緩存數設置大于一,我 們只能假設nextval值都是
獨立的, 而不能假設它們都是純粹順序生成的. 同樣,last_value將反映由任何后端
保留的最 后數值,不管它是不是nextval曾返回過的. 另外一個問題是在這樣的序列
上執行的 setval 將不會被 其它后端知曉,直道它們用光所有預先分配的緩存數值.
注意
使用 DROP SEQUENCE 語句來刪除序列.
序列是基于 bigint 運算的,因此其范圍不能超過八字節的 整數范圍
(-9223372036854775808 到 9223372036854775807).在一些老一點的平臺上可能沒有
對八字節整數的編譯器支持, 這種情況下序列使用普通的 integer 運算(范圍是
-2147483648 到 +2147483647).
如果 cache 大于一,那么每個后端使用其自身的緩存來存儲分配的數字. 已分配但當
前會話沒有使用的數字將丟失,導致序列里面出現"空洞".
用法
創建一個叫 serial的遞增序列,從101開始:
CREATE SEQUENCE serial START 101;
從此序列中選出下一個數字:
SELECT nextval ('serial');
nextval
-------
114
在一個 INSERT 中使用此序列:
INSERT INTO distributors VALUES (nextval('serial'),'nothing');
在一個 COPY FROM 后更新序列:
BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;
兼容性 SQL92
CREATE SEQUENCE是 PostgreSQL 語言擴展. 在里沒有 CREATE SEQUENCE 語句.
----------------------------------------------------------------------------
----
CREATE TABLE AS
CREATE TABLE AS
Name
CREATE TABLE AS -- 從一條查詢的結果中創建一個新表
Synopsis
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [,
...] ) ]
AS query
描述
CREATE TABLE AS創建一個表并且用來自 SELECT 命令計算出來的數據填充該表. 該表
的字段和 SELECT 輸出字段 的名字及類型相關.(只不過你可以通過明確地給出一個字
段名字 列表來覆蓋 SELECT 的字段名).
CREATE TABLE AS和創建視圖有點象, 不過兩者之間實在是有比較大差異∶它創建一個
新表并且只對 SELECT 計算一次來填充這個新表. 新表不能跟蹤 SELECT 的源表隨后
做的變化. 相比之下,每次做查詢的時候,視圖都重新計算 SELECT.
這條命令和 SELECT INTO有相同的功能, 但是我們建議你多用這條命令,因為它不象
SELECT ... INTO 語法那樣融合和一些其它用法混淆. ,
參數
[LOCAL] TEMPORARY 或 [LOCAL] TEMP
如果聲明了這個選項,則該表作為臨時表創建. 臨時表在會話退出的時候自動刪除.
在該臨時表存在的期間(本次會話), 同名的永久表是不可見的. 任何在臨時表上創建的
索引也自動是臨時的.
LOCAL 關鍵字是可選的.
table_name
要創建的表名.這個表不能是已經存在的. 不過,臨時表可以創建為和現有永久表同
名. (譯注∶這里指的是同名臨時表或永久表不能已經存在)
column_name
字段的名稱.多字段的名稱可以用逗號分隔的字段名列表聲明. 如果沒有提供字段名
子,那么就從查詢的輸出字段名中獲取.
query
有效的查詢語句(也就是一條 SELECT 命令),請參考 SELECT 獲取可以使用的語法的描
述.
診斷
請參考 CREATE TABLE和 SELECT 獲取可能的輸出的概要.
注意
這條命令從功能上等效于 SELECT INTO , 但是我們更建議你用這個命令,因為它不太
可能和 SELECT ... INTO 語法的其它方面的使用混淆.
兼容性 SQL92
這條命令是根據 Oracle 的一個特性 制作的.在 或 SQL99 中沒有功能相等的命
令.不過, 把CREATE TABLE 和 INSERT ... SELECT 組合起來可以通過略微多一些的
工作完成同樣的事情.
歷史
自 PostgreSQL 6.3 開始就已經有 CREATE TABLE AS 命令了.
又見
CREATE TABLE, CREATE VIEW , SELECT , SELECT INTO
----------------------------------------------------------------------------
----
CREATE TABLE
CREATE TABLE
Name
CREATE TABLE? --? 定義一個新表
Synopsis
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
{ column_name data_type [ DEFAULT default_expr ] [ column_constraint [,
... ] ]
| table_constraint } [, ... ]
)
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH OIDS | WITHOUT OIDS ]
這里 column_constraint 可以是:
[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY |
CHECK (expression) |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL ]??? [
ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
而 table_constraint 可以是:
[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] ) | PRIMARY KEY ( column_name [, ...
] ) |
CHECK ( expression ) |
FOREIGN KEY ( column_name [, ...
] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ]
}
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
描述
CREATE TABLE將在當前數據庫創建一個新的, 初始為空的表.該表將由發出此命令的
用戶所有.
CREATE TABLE還自動創建一個數據類型, 該數據類型代表對應該表一行的元組類型(結
構類型). 因此,表不能和一個現有數據類型同名.
一個表的字段數不能超過 1600.(實際上,真正的限制比這低, 因為還有元組長度的
約束).表不能和系統表同名.
可選的約束子句聲明約束(或者測試),新行或者更新的行必須滿足這些約束才能成功插
入或更新.約束是一個命名的規則∶ 它是一個 SQL 對象,它通過對發生在表上的插
入,更新或者刪除操作的結果進行限制來協助我們定義有效的數值集合.
定義約束又兩種方法∶表約束和列約束.一個列約束是作為 一個列定義的一部分定義
的.而表約束并不和某個列綁在一起,它可以作用于多于一個列上.每個列約束也可以
寫成表約束; 如果某個約束只影響一個列,那么列約束只是符號上的簡潔方式而已.
參數
[LOCAL] TEMPORARY 或 [LOCAL] TEMP
如果聲明了此參數,則該表創建為臨時表.臨時表在會話結束時自動刪除. 現有同名
永久表在臨時表存在期間在本會話過程中是不可見的.任何在臨時表上創建的索引也都
會自動刪除.
關鍵字 LOCAL 是可選的.又見 兼容性 SQL92 .
table_name
要創建的表的名字.
column_name
在新表中要創建的字段名字.
data_type
該字段的數據類型.它可以包括數組說明符.請參考 用戶手冊獲取有關數據類型和數
組的更多信息.
DEFAULT default_expr
DEFAULT 子句給它所出現的字段一個缺省數值.該數值可以是任何不含變量的表達式
(不允許使用子查詢和對本 表中的其它字段的交叉引用).缺省表達式的數據類型必須
和字段類型匹配.
缺省表達式將被用于任何未聲明該字段數值的插入操作. 如果字段上沒有缺省值,那
么缺省是 NULL.
INHERITS ( parent_table [, ... ] )
可選的 INHERITS 子句聲明一列表,這個新表自動從這列表 中繼承所有字段.如果在
多于一個父表中存在同名的字段,那么就會報告一個錯誤,除非這些字段的數據類型在
每個父表里都是匹配的. 如果沒有沖突,那么重復的字段在新表中融合成一個字段.
如果新表的字段名列表中包括和繼承的字段同名的,那么它的數據類型也必須和上面一
樣與繼承字段匹配,并且這些字段定義會融合成一個. 不過,同名的繼承和新字段聲
明可以聲明不同的約束∶所有的繼承過來的約束以及聲明的約束都融合到一起,并且全
部應用于新表. 如果新表為該字段明確的聲明了一個缺省數值,那么此缺省數值覆蓋
任何 來自繼承字段聲明的缺省值.否則,任何為該字段聲明了缺省數值的父表都必須
聲明相同的缺省,否則就會報告一個錯誤.
WITH OIDS 或 WITHOUT OIDS
這個可選的子句聲明新表中的行是否應該擁有賦予它們的 OID (對象標識). 缺省是有
OID.(如果新表從任何有 OID 的表繼承而來,那么就算 這條命令說了 WITHOUT
OIDS,也會強制 WITH OIDS.)
聲明 WITHOUT OIDS 允許用戶禁止為行或者表生成 OID. 這么做對大表是值得的,因
為這樣可以減少 OID 消耗并且推遲 32 位 OID 計數器的消耗.一旦該計數器重疊,那
么就不能再假設 OID 的唯一,這樣它的實用性就大打折扣.
CONSTRAINT constraint_name
列或表約束的可選名字.如果沒有聲明,則由系統生成一個名字.
NOT NULL
字段不允許包含 NULL 數值.等效于列約束 CHECK (column NOT NULL).
NULL
該字段允許包含 NULL 數值.這是缺省.
這個子句的存在只是為和那些非標準 SQL 數據庫兼容. 我們不建議在新應用中使用
它.
UNIQUE (column constraint)
UNIQUE ( column_name [, ... ] ) (table constraint)
UNIQUE 聲明一個規則,該規則表示一個表里的一個或者多個獨立的字段組合的分組只
能包含唯一的數值.表的唯一約束 的行為和列約束的一樣,只不過多了跨多行的能
力.
對于唯一約束的用途而言,系統認為 NULL 數值是不相等的.
每個唯一表約束都必須命名一個字段的集合,該集合必須和其它唯一 約束命名字段集
合或者該表定義的主鍵約束不同.(否則就只是同樣的 約束寫了兩次.)
PRIMARY KEY (column constraint)
PRIMARY KEY ( column_name [, ... ] ) (table constraint)
主鍵約束表明表中的一個或者一些字段只能包含唯一(不重復)非 NULL 的數值. 從技
術上講,PRIMARY KEY 只是 UNIQUE 和 NOT NULL 的組合,不過把一套字段標識為主鍵
同時也體現了大綱設計的元數據,因為主鍵意味著其它表可以拿這套字段 用做行的唯
一標識.
一個表只能聲明一個主鍵,不管是作為字段約束還是表約束.
主鍵約束應該定義在同個表上的一個與其它唯一約束所定義的不同的字段集合上.
CHECK (expression)
CHECK 約束聲明一個完整性約束或者測試,一次插入或者更新操作若想成功則必須滿足
這個條件. 每個約束都必須是一個生成布爾結果的表達式.一個在字段定義中出現的
目前,CHECK 表達式不能包含子查詢或者 引用除本行字段之外的變量.
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 列約束聲明一個由新表中一列或者多列組成的組應該只包含匹配引用的表
reftable 中對應引用的字段 refcolumn 中的數值. 如果省略 refcolumn, 則使用
reftable 的主鍵. 被引用字段必須是被引用表中的唯一字段或者主鍵.
向這些字段增加的數值將使用給出的匹配類型與參考表中的參考列 中的數值進行匹
配.有三種匹配類型∶MATCH FULL, MATCH PARTIAL,和一種缺省匹配類型(如果沒有
聲明 匹配類型的話).MATCH FULL 將不允許一個多字段外鍵的 字段為 NULL,除非所
有外鍵字段都為 NULL.缺省匹配類型允許某些 外鍵字段為 NULL 而外鍵的其它部分不
是 NULL.MATCH PARTIAL 還沒實現.
另外,當被參考字段中的數據改變的時候,那么將對本表的字段中的數據 執行某種操
作.ON DELETE 子句聲明當被參考表中的 被參考行將被刪除的時候要執行的操作.類
似,ON UPDATE 子句聲明被參考表中被參考字段更新為新值的時候要執行的動作.如果
該行被更新,但被參考的字段實際上沒有變化,那么就不會有任何動作. 下面是每個
子句的可能的動作∶
NO ACTION
生成一個錯誤,表明刪除或者更新將產生一個違反外鍵約束的動作. 它是缺省動作.
RESTRICT
和 NO ACTION 一樣.
CASCADE
刪除任何引用了被刪除行的行,或者分別把引用行的字段值更新為 被參考字段的新數
值.
SET NULL
把引用行數值設置為 NULL.
SET DEFAULT
把引用列的數值設置為它們的缺省值.
如果主鍵字段經常更新,那么我們給 REFERENCES 字段增加一個索引可能是合適的,這
樣與 REFERENCES 字段 相關聯的 NO ACTION 和 CASCADE 動作可以更有效地執行.
DEFERRABLE 或 NOT DEFERRABLE
這兩個關鍵字設置該約束是否可推遲.一個不可推遲的約束將在每條命令之后 馬上檢
查.可以推遲的約束檢查可以推遲到事務結尾 (使用 SET CONSTRAINTS命令).缺省是
NOT DEFERRABLE.目前只有外鍵約束 接受這個子句.所有其它約束類型都是不可推遲
的.
INITIALLY IMMEDIATE or INITIALLY DEFERRED
如果約束是可推遲的,那么這個子句聲明檢查約束的缺省時間. 如果約束是
INITIALLY IMMEDIATE, 那么每條語句之后就檢查它.這個是缺省.如果約束是
INITIALLY DEFERRED,那么只有在事務結尾才檢查它. 約束檢查的時間可以用 SET
CONSTRAINTS命令修改.
診斷
CREATE
如果表成功創建,返回此信息.
ERROR
如果表創建失敗返回這條信息.通常它還帶著一些描述性文本, 比如∶ ERROR:
Relation 'table' already exists,這個錯誤出現在運行時 -- 如果聲明的表已經在
數據庫中存在了.
注意
如果一個應用使用了 OID 標識表中的特定行,那么我們建議在該表的 oid 字段上創建
一個唯一約束,以確保該表的 OID 即使在計數器重疊之后也是唯一的.如果你需要一
個整個數據庫范圍的唯一 標識,那么就要避免假設 OID 是跨表唯一的,你可以用
tableoid 和行 OID 的組合來實現這個目的. (將來的 PostgreSQL 很可能為每個表使
用獨立 的 OID 計數器,因此包括 tableoid 組成數據庫范圍內 的唯一標識將是必須
的,而不是可選的.)
提示: 對那些沒有主鍵的表,我們不建議使用 WITHOUT OIDS, 因為如果既沒有 OID
又沒有唯一數據鍵字,那么就很難標識特定的行.
PostgreSQL 自動為每個唯一約束和主鍵約束 創建一個索引以確保唯一性.因此,我們
不必為主鍵字段創建明確的索引. (參閱 CREATE INDEX獲取更多信息.)
SQL 92 標準認為 CHECK 字段約束只能引用它們施加的字段; 只有 CHECK 表約束可以
引用多個字段. PostgreSQL 并未強制這樣的限制; 它把字段約束和表約束看成是類
似的.
唯一約束和主鍵在目前的實現里是不能繼承的. 這樣,如果把繼承和唯一約束組合在
一起會導致無法運轉.
例子
創建表 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 <> '')
);
創建一個帶有 2 維數組的表∶
CREATE TABLE array (
vector INT[][]
);
為表 films 定義一個唯一表約束. 唯一表約束可以在表的一個或多個字段上定義∶
CREATE TABLE films (
code??????? CHAR(5),
title?????? VARCHAR(40),
did???????? DECIMAL(3),
date_prod?? DATE,
kind??????? VARCHAR(10),
len???????? INTERVAL HOUR TO MINUTE,
CONSTRAINT production UNIQUE(date_prod)
);
定義一個檢查列約束∶
CREATE TABLE distributors (
did???? DECIMAL(3) CHECK (did > 100),
name??? VARCHAR(40)
);
定義一個檢查表約束∶
CREATE TABLE distributors (
did???? DECIMAL(3),
name??? VARCHAR(40)
CONSTRAINT con1 CHECK (did > 100 AND name <> '')
);
為表 films 定義一個主鍵表約束. 主鍵表約束可以定義在表上的一個或多個字段.
CREATE TABLE films (
code??????? CHAR(5),
title?????? VARCHAR(40),
did???????? DECIMAL(3),
date_prod?? DATE,
kind??????? VARCHAR(10),
len???????? INTERVAL HOUR TO MINUTE,
CONSTRAINT code_title PRIMARY KEY(code,title)
);
為表 distributors 定義一個主鍵約束. 下面兩個例子是等效的,第一個例子使用了
表約束語法,第二個使用了列約束表示法.
CREATE TABLE distributors (
did???? DECIMAL(3),
name??? CHAR VARYING(40),
PRIMARY KEY(did)
);
CREATE TABLE distributors (
did???? DECIMAL(3) PRIMARY KEY,
name??? VARCHAR(40)
);
下面這個例子給字段 name 賦予了一個文本常量 缺省值,并且將字段 did 的缺省值安
排為 通過選擇序列對象的下一個值生成.modtime 的缺省值將是該行插入的時候的時
間.
CREATE TABLE distributors (
name????? VARCHAR(40) DEFAULT 'luso films',
did?????? INTEGER DEFAULT NEXTVAL('distributors_serial'),
modtime?? TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
在表 distributors 上定義兩個 NOT NULL 列約束,其中之一明確給出了名字∶
CREATE TABLE distributors (
did???? DECIMAL(3) CONSTRAINT no_null NOT NULL,
name??? VARCHAR(40) NOT NULL
);
為 name 字段定義一個唯一約束∶
CREATE TABLE distributors (
did???? DECIMAL(3),
name??? VARCHAR(40) UNIQUE
);
上面的和下面這樣作為一個表約束聲明是一樣的∶
CREATE TABLE distributors (
did???? DECIMAL(3),
name??? VARCHAR(40),
UNIQUE(name)
);
兼容性 SQL92
CREATE TABLE遵循 和 SQL99 的一個子集 的中間狀態,一些例外情況在下面和上面的
診斷中列出.
臨時表
除了局部臨時表之外, 還定義了 CREATE GLOBAL TEMPORARY TABLE 語句. 全局臨時
表也可以在其它會話中可見.
對于臨時表,有一個可選的 ON COMMIT 子句∶
CREATE { GLOBAL | LOCAL } TEMPORARY TABLE table ( ... ) [ ON COMMIT {
DELETE | PRESERVE } ROWS ]
ON COMMIT 子句表明該臨時表在執行 COMMIT 的時候是否應該清空行. 如果省略了 ON
OMMIT 子句, 聲明缺省是 ON COMMIT DELETE ROWS.不過, PostgreSQL 的行為總是
類似 ON COMMIT PRESERVE ROWS.
NULL "約束"
NULL "約束"(實際上不是約束) 是 PostgreSQL 對 的擴展,包括它是為了和其它一些
RDBMS 兼容(以及為了和 NOT NULL 約束對稱).因為它是任何字段的缺省,所以它的出
現只是噪音而已.
斷言
斷言是一種特殊類型的完整性約束,它和其它約束共享相同的名字空間. 不過,斷言
和約束不同的是,它不一定依賴于某個特定的表,因此 提供了 CREATE ASSERTION 語
句作為定義 約束的一個可選的方法∶
CREATE ASSERTION name CHECK ( condition )
PostgreSQL 目前還沒有實現斷言.
繼承
通過 INHERITS 子句的多重繼承是 PostgreSQL 語言的擴展. SQL99(但不包括 )使用
不同的語法和語義定義了單繼承. SQL99 風格的繼承還沒有在 PostgreSQL 中實現.
對象 ID
PostgreSQL 的 OID 的概念不是標準.
又見
ALTER TABLE , DROP TABLE
----------------------------------------------------------------------------
----
CREATE TRIGGER
Name
CREATE TRIGGER? --? 定義一個新的觸發器
Synopsis
CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] }
ON table FOR EACH { ROW | STATEMENT }
EXECUTE PROCEDURE func ( arguments )
輸入
name
賦予新觸發器的名稱.
table
現有表名稱.
event
INSERT,DELETE 或 UPDATE 之一.
func
一個用戶提供的函數.
輸出
CREATE
如果觸發器成功創建,返回此信息.
描述
CREATE TRIGGER將向現有數據庫中增加一個新的觸發器. 觸發器將與表 table 相聯并
且將執行聲明的函數 func.
觸發器可以聲明為在對記錄進行操作之前 在檢查約束之前和 INSERT,UPDATE 或
DELETE 執行前)或之后(在檢 查約束之后和完成 INSERT, UPDATE 或 DELETE 操
作)觸發. 如果觸發器在事件之前,觸發器可能略過當前記錄 的操作或改變被插入的
(當前)記錄(只對 INSERT 和 UPDATE 操作有效). 如果觸發器在事件之后,所有
更改,包括最后的插入, 更新或刪除對觸發器都是"可見"的.
SELECT并不更改任何行,因此你不能創建 SELECT 觸發器.這種場合下規則和視圖更合
適些.
請參考 PostgreSQL 程序員手冊中SPI 和觸發器章節獲取更多信息.
注意
CREATE TRIGGER是 PostgreSQL 語言擴展.
只有表所有者可以就此表創建一個觸發器.
在當前的版本,STATEMENT 觸發器還沒有實現.
請參考 DROP TRIGGER 獲取如何刪除觸發器的信息.
用法
在插入或更新表 films 之前檢查一下聲明的分銷商代碼是否存在于 distributors 表
中:
CREATE TRIGGER if_dist_exists
BEFORE INSERT OR UPDATE ON films FOR EACH ROW
EXECUTE PROCEDURE check_primary_key ('did', 'distributors', 'did');
在刪除或更新一個分銷商的內容之前, 將所有記錄移到表 films 中:
CREATE TRIGGER if_film_exists
BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW
EXECUTE PROCEDURE check_foreign_key (1, 'CASCADE', 'did', 'films',
'did');
兼容性 SQL92
在 里沒有 CREATE TRIGGER語句.
上面第二個例子可以使用一個 FOREIGN KEY 約束實現:
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? --? 定義一個新的數據類型
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
將要創建的類型名.
internallength
一個文本串,說明新類型的內部長度.
externallength
一個文本串,說明新類型的外部(顯示)長度.
input_function
一個函數的名稱,由 CREATE FUNCTION創建,將數據從外部類型轉換成內部類型.
output_function
一個函數的名稱,由 CREATE FUNCTION創建,將數據從內部格式轉換成適于顯示的形
式.
element
被創建的類型是數組;這個聲明數組元素的類型.
delimiter
將用做數組的數據元素之間分隔符的字符.
default
該類型的缺省值.通常是省略它的,所以缺省是 NULL.
send_function
用 CREATE FUNCTION 創建的函數名,它將該類型的數據轉換成一個適合傳輸到其他機
器的形式.
receive_function
用 CREATE FUNCTION 創建的函數名,將該類型從適于傳輸給其他機器的形式轉換為內
部形式.
alignment
該數據類型的存儲對齊要求.如果聲明了,必須是 'char', 'int2', 'int4' 或
'double'; 缺省是 'int4'.
storage
該數據類型的存儲技術.如果聲明了,必須是 'plain','external', 'extended',
或 'main'; 缺省是 'plain'.
輸出
CREATE
如果創建類型成功,返回此信息.
描述
CREATE TYPE允許用戶在 PostgreSQL 當前數據庫里創建一個新的用戶數據類型.定義
該類型的用戶成為其所有者. typename 是新類型的名稱而且必須在所定義的數據庫中
唯一.
CREATE TYPE需要在定義類型之前先注冊兩個函數(用 CREATE FUNCTION 命令). 新
的基本類型的形式由 input_function決定,它將該類型的外部形式轉換成可以被對該
類型操作的操作符和函數識別的形式. 自然, output_function 用做相反用途. 輸
入函數可以聲明為接受一個類型為 opaque 的參數,或者接受三個類型分別為
opaque,OID,int4 的參數. (第一個參數是 C 字串形式的輸入文本,第二個是在該
類型為數組類型時 其元素的類型,第三個是目標字段的 typmod,如果已知的話.) 輸
出函數可以聲明為接受一個類型為 opaque 的參數, 或者接受兩個類型為 opaque,
OID 的參數. (第一個參數實際上是數據類型本身,但是因為輸出函數必須首先聲明,
所以把它聲明為接受 opaque 類型更簡單.第二個參數也是 用于數組類型的數組元素
類型.)
新的基本數據類型可定義成為定長,這時 internallength 是一個正整數,也可以是變
長的,通過把 internallength 設置為 VARIABLE 表示.(在內部,這個狀態是通過將
typlen 設置為 -1 實現的.)所有變長類型的內部形式 都必須以一個整數開頭,這個
整數給出此類型這個數值的全長.
外部表現形式的長度類似使用 externallength 關鍵字 聲明.(目前這個值沒有使用,
通常是省略的,這樣就缺省是 VARIABLE.)
要表示一個類型是數組,用 ELEMENT 關鍵字聲明數組元素的 類型.比如,要定義一個
4 字節整數("int4")的數組,聲明
ELEMENT = int4
有關數組類型的更多細節在下面描述.
要聲明用于這種類型數組的外部形式的數值之間的分隔符,可用 delimiter 聲明指定
分隔符.缺省的分隔符是逗號(','). 請注意分隔符是和數組元素類型相關聯,而不是
數組類型本身.
如果用戶希望字段的數據類型缺省時不是 NULL,而是其它什么東西,那么你可以聲明
一個缺省值. 在 DEFAULT 關鍵字里面聲明缺省值. (這樣的缺省可以被附著在特定字
段上的明確的 DEFAULT 子句覆蓋.)
可選的參數 send_function 和 receive_function 目前還沒有使用,并且通常被忽略
(允許它們分別缺省為 output_function 和 input_function.) 這些函數將來可能復
活過來用于聲明與機器相關的二進制表現.
可選的標簽 PASSEDBYVALUE 表明該數據類型是通過傳值傳遞的而不是傳引用.請注意
你不能對那些內部形式超過 Datum 類型寬度 (大多數機器上是四字節,有少數機器上
是八字節.) 的類型進行傳值.
alignment關鍵字 聲明該數據類型要求的對齊存儲方式.允許的數值等效于按照 1,
2, 4,或者 8 字節邊界對齊.請注意變長類型必須有至少 4 字節的對齊, 因為它們
必須包含一個 int4 作為它們的第一個成份.
storage關鍵字 允許為變長數據類型選擇 TOAST 存儲方法 (定長類型只允許使用
plain). plain 為該數據類型關閉 TOAST:它將 總是用內聯的方式而不是壓縮的方
式存儲. extended 是 TOAST 完全兼容的:系統將首先試圖壓縮 一個長的數據值,然
后如果它仍然太長的話就將它的值移出主表的行. external 允許將值移出主表的行,
但系統將不會壓縮它. main 允許壓縮,但是不贊成把數值移動出主表.(用這種存儲
方法的數據項可能仍將移動出主表,如果不能放在一行里的話, 但是它們將比
extended 和 external 項更愿意呆在主表里.)
數組類型
在創建用戶定義數據類型的時候,PostgreSQL 自動創建一個與之關聯的數組類型,其
名字由該基本類型的名字前綴一個下劃線組成.分析器理解這個命名傳統,并且把對類
型為 foo[] 的字段的請求轉換成對類型為 _foo 的字段的請求.這個隱含創建的數組
類型是變長并且 使用內建的輸入和輸出函數 array_in 和 array_out.
你很可能會問"如果系統自動制作正確的數組類型,那為什么有個 ELEMENT選項?"使用
ELEMENT 有用的唯一 的場合是在你制作的定長類型碰巧在內部是一個 N 個相同事物的
數組, 而你又想允許這 N 個事物可以通過腳標直接關聯,以及那些你準備 把該類型
當做整體進行的操作.比如,類型 name 就允許其 構成 char 用這種方法關聯.一個
二維的 point 類型也可以允許其兩個構成浮點型按照類似 point[0] 和 point[1] 的
方法關聯. 請注意這個功能只適用與那些內部形式完全是 N 個相等字段的定長類
型.一個可以腳標化的變長類型必須有被 array_in 和 array_out 使用的一般化的內
部表現形式.出于歷史原因(也就是說,那些明顯錯誤但補救來得太遲的 問題),定長
數組類型的腳標從零開始,而不是象變長類型那樣的從一開始.
注意
類型名不能以下劃線("_") 開頭而且只能有 30 個字符長.(或者通常是
NAMEDATALEN-2, 而不是其它名字那樣的可以有 NAMEDATALEN-1 個字符). 以下劃線
開頭的類型名被解析成內部創建的數組類型名.
例子
這個命令創建box數據類型,并且將這種類型用于一個表定義:
CREATE TYPE box (INTERNALLENGTH = 16,
INPUT = my_procedure_1, OUTPUT = my_procedure_2);
CREATE TABLE myboxes (id INT4, description box);
如果 box 的內部結構是一個四個 float4 的數組,我們可以說
CREATE TYPE box (INTERNALLENGTH = 16,
INPUT = my_procedure_1, OUTPUT = my_procedure_2,
ELEMENT = float4);
它允許一個 box 的數值成分 float 可以用腳標關聯. 否則該類型和前面的行為一
樣.
這條命令創建一個大對象類型并將其用于一個表定義:
CREATE TYPE bigobj (INPUT = lo_filein, OUTPUT = lo_fileout,
INTERNALLENGTH = VARIABLE);
CREATE TABLE big_objs (id int4, obj bigobj);
兼容性 SQL92
CREATE TYPE命令是 PostgreSQL 擴展.在 SQL99 里 有一個 CREATE TYPE 語句,但是
細節上和 PostgreSQL 的有比較大區別.
又見
CREATE FUNCTION , DROP TYPE , PostgreSQL 程序員手冊
----------------------------------------------------------------------------
----
CREATE USER
Name
CREATE USER? --? 創建一個新的數據庫用戶帳戶
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 子句可以用于選擇正在被創建的用戶的 PostgreSQL 用戶標識。 這個用戶標識
不需要和 UNIX 系統用戶標識匹配,但是有些人愿意讓兩者相同。
如果沒有聲明這個,缺省使用已分配的最高用戶標識加一。
[ encrypted | unencrypted ] password
設置用戶的口令,如果你不準備使用口令認證, 那么你可以省略這個選項,否則該用
戶將不能聯接到一個口令認證的服務器上。
ENCRYPTED/UNENCRYPTED 控制口令在數據庫中是否以加密 形式存儲.使用加密口令存
儲的時候老的客戶端可能有通訊問題.
參閱 管理員手冊中關于客戶端認證的部分 獲取關于如何設置認證機制的詳細信息。
CREATEDB
NOCREATEDB
這個子句定義用戶的創建數據庫權限. 如果聲明了 CREATEDB,被定義的用戶將允許創
建其自己的數據庫.而使用 NOCREATEDB 將否決該用戶的創建數據庫的能力. 如果忽
略本子句,缺省是 NOCREATEDB.
CREATEUSER
NOCREATEUSER
該子句決定一個用戶是否能創建一個新的用戶. 這個選項同樣把次用戶變成數據庫超
級用戶,可以跨越所有 訪問限制。省略這個參數將置用戶的這個屬性為
NOCREATEUSER.
groupname
一個組名稱,把這個用戶設為該組成員。 你可以列出多個組名字.
abstime
VALID UNTIL (有效期)子句設置一個絕對時間,過了該時間后用戶的 PostgreSQL 登
陸將不再有效. 如果省略這個子句,登陸將總是有效的.
輸出
CREATE USER
如果命令成功完成,返回此信息.
描述
CREATE USER將向一個 PostgreSQL 實例增加一個新用戶.參考管理員手冊獲取關于管
理用戶和認證的信息。 要執行這條命令,你必須是一個數據庫超級用戶。
使用 ALTER USER修改用戶的口令和權限, DROP USER刪除一個用戶。 使用 ALTER
GROUP從組中增加或刪除用戶。 PostgreSQL 里有一個腳本 createuser與此命令相同的
功能(實際上,它調用這條命令), 但是可以在命令行上運行。
用法
創建一個沒有口令的用戶:
CREATE USER jonathan
創建一個有口令的用戶:
CREATE USER davide WITH PASSWORD 'jw8s0F4'
創建一個有口令的用戶,其帳號在2001年底失效. 注意當2002年走過一秒后,該帳號
將不再有效:
CREATE USER miriam WITH PASSWORD 'jw8s0F4' VALID UNTIL 'Jan 1 2002'
創建一個擁有創建數據庫權限的用戶:
CREATE USER manuel WITH PASSWORD 'jw8s0F4' CREATEDB
兼容性 SQL92
在里沒有CREATE USER 語句.
----------------------------------------------------------------------------
----
CREATE VIEW
Name
CREATE VIEW? --? 定義一個視圖
Synopsis
CREATE VIEW view AS SELECT query
輸入
view
所要創建的視圖名稱.
query
一個將為視圖提供行和列的 SQL 查詢.
請參閱 SELECT 語句獲取有效參數的更多信息.
輸出
CREATE
如果視圖創建成功,返回此信息.
ERROR: Relation 'view' already exists
如果在數據庫中已經存在所聲明的視圖.
NOTICE: Attribute 'column' has an unknown type
如果不聲明,所創建的視圖將有一個未知類型的字段. 例如,下面命令返回一個警
告:
CREATE VIEW vista AS SELECT 'Hello World'
然而下面命令將不出現警告:
CREATE VIEW vista AS SELECT text 'Hello World'
描述
CREATE VIEW將定義一個表的視圖. 這個視圖不是物理上實際存在(于磁盤)的.具體
的說,自動生成 一個改寫索引規則的查詢用以支持在視圖上的檢索.
注意
目前,視圖是只讀的∶系統將不允許在視圖上插入,更新,或者刪除數據.你可以通過
在視圖上創建把插入等動作重寫為向其它表做合適操作的規則來 實現可更新視圖的效
果.更多信息詳見 CREATE RULE .
使用 DROP VIEW 語句刪除視圖.
用法
創建一個由所有 Comedy (喜劇)電影組成的視圖:
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
這個選項用于可更新視圖. 所有對視圖的 INSERT 和 UPDATE 都要經過視圖定義條件
的校驗. 如果 沒有通過校驗,更新將被拒絕.
LOCAL
對這個視圖進行完整性檢查.
CASCADE
對此視圖和任何相關視圖進行完整性檢查. 在既沒有聲明 CASCADE 也沒有聲明 LOCAL
時,假設為 CASCADE.
----------------------------------------------------------------------------
----
DECLARE
DECLARE
Name
DECLARE? --? 定義一個游標
Synopsis
DECLARE cursorname [ BINARY ] [ INSENSITIVE ] [ SCROLL ]
CURSOR FOR query
[ FOR { READ ONLY | UPDATE [ OF column [, ...] ] ]
輸入
cursorname
將在隨后 FETCH 操作中使用的游標名.
BINARY
令游標以二進制而不是文本格式獲取數據.
INSENSITIVE
關鍵字, 表明從游標檢索出來的數據不應該被其他進程或游標的更新動作影響. 因
為在 PostgreSQL 里,游標的操作總是發生在事務 里,所以總是符合上面描述.這個
關鍵字沒有作用.
SCROLL
關鍵字,表明每個 FETCH 操作可以檢索出多行數據. 因為在PostgreSQL 在任何情況
下都允許這樣, 所以這個關鍵字沒有作用.
query
一個 SQL 查詢,它提供由游標控制的行. 請參考 SELECT 語句獲取有關有效參數的詳
細信息.
READ ONLY
關鍵字,表明游標將用于只讀模式. 因為這是 PostgreSQL 唯一的游標訪問模式,所
以該關鍵字沒有作用.
UPDATE
關鍵字,表明游標將被用于更新表. 因為游標更新目前還不被 PostgreSQL 支持,所
以這個關鍵字將產生一個錯誤信息.
column
將被更新的列.因為游標更新目前不被 PostgreSQL 支持, 所以 UPDATE 子句將產生
一個錯誤信息.
輸出
SELECT
如果 SELECT 成功運行,返回此信息.
NOTICE: Closing pre-existing portal "cursorname"
如果在當前的事務塊中此游標名稱已經定義,返回此信息. 前面定義的游標被丟棄.
ERROR: DECLARE CURSOR may only be used in begin/end transaction blocks
如果一個游標沒有在事務塊內部定義,返回此信息.
描述
DECLARE允許用戶創建游標, 用于在一個大的查詢里面檢索少數幾行數據. 使用
FETCH,游標可以既可以返回文本也可以返回二進制格式。 .
通常游標返回文本格式,要么是 ASCII 要么是某種由 PostgreSQL 特定的后端決定的
編碼方式. 因為數據在系統內部是用二進制格式存儲的, 系統必須對數據做一定轉換
以生成文本格式.另外,文本格式一般都比對應的二進制格式占的存儲空間大. 一旦
格式轉換回文本,客戶應用需要將文本轉換為二進制格式來操作. BINARY 游標給你返
回內部二進制形態的數據。
作為例子,如果查詢從一個整數列返回一個一, 在通常的游標里你將獲得一個字符串
'1'而如果是一個二進制查詢,你將得到一個 4-字節的等于ctrl-A('^A')的數值.
游標應該小心使用 BINARY. 一些用戶應用如 psql 是不識別二進制游標的, 而且期
望返回的數據是文本格式.
而且,字符串表示方式是與硬件體系無關的, 而二進制格式會因不同的硬件體系不同
而不同,而且 PostgreSQL 對二進制游標不做字節序解析或者其他格式轉換 。 因此,
如果你的客戶機和服務器使用不同的格式 (如: "高位高字節" 和 "底位底字節
").你可能就不會希望你的數據 以二進制格式返回.所以二進制游標將比文本略微快
一點,因為二進制在服務器和客戶端的數據傳輸中有較少的轉換.
小技巧: 如果你希望用 ASCII 顯示數據, 將數據以 ASCII 模式訪問將節省客戶端的
工作.
注意
游標只能在事務中使用.使用 BEGIN, COMMIT和 ROLLBACK定義一個事務塊。
在 中游標只能在嵌入 SQL (ESQL) 的應用中使用. PostgreSQL 后端沒有一個明確的
OPEN cursor 語句;一個游標被認為在定義時就已經打開了. 不過,PostgreSQL嵌入
的 SQL 預編譯器, ecpg, 支持 習慣,包括那些和 DECLARE 和 OPEN 相關的語句.
用法
定義一個游標:
DECLARE liahona CURSOR
FOR SELECT * FROM films;
兼容性 SQL92
只允許在嵌入的 SQL 中和模塊中使用游標. PostgreSQL 允許交互地使用游標. 允
許嵌入或模塊的游標更新數據庫信息. 所有 PostgreSQL 的游標都是只讀的. BINARY
關鍵字是 PostgreSQL 擴展.
----------------------------------------------------------------------------
----
DELETE
DELETE
Name
DELETE? --? 刪除一個表中的行
Synopsis
DELETE FROM [ ONLY ] table [ WHERE condition ]
輸入
table
一個現存表的名字
condition
這是一個 SQL 選擇查詢,它返回要被刪除的行.
請參考 SELECT 語句獲取關于 WHERE 子句的更多信息.
輸出
DELETE count
如果行被成功的刪除返回此信息. count 是要被刪除的行數.
如果 count 為 0, 沒有行被刪除.
描述
DELETE從指明的表里刪除滿足 WHERE condition (條件)的行.
如果 condition (WHERE 子句)不存在, 效果是刪除表中所有行.結果是一個有效的
空表.
小技巧: TRUNCATE 是一個 PostgreSQL 擴展, 它提供一個更快的從表中刪除所有行的
機制。
缺省時DELETE將刪除所聲明的表和所有它的子表的記錄. 如果你希望只更新提到的
表,你應該使用OLNY子句.
要對表進行修改,你必須有寫權限,同樣也必須有讀表的權限,這樣才能對符合
condition(條件) 的值進行讀取操作.
用法
刪除所有電影(films)但不刪除音樂(musicals):
DELETE FROM films WHERE kind <> 'Musical';
SELECT * FROM films;
code |?????????? title?????????? | did | date_prod | kind?? | len
-------+---------------------------+-----+------------+---------+-------
UA501 | West Side Story?????????? | 105 | 1961-01-03 | Musical | 02:32
TC901 | The King and I??????????? | 109 | 1956-08-11 | Musical | 02:13
WD101 | Bed Knobs and Broomsticks | 111 |??????????? | Musical | 01:57
(3 rows)
清空表 films:
DELETE FROM films;
SELECT * FROM films;
code | title | did | date_prod | kind | len
------+-------+-----+-----------+------+-----
(0 rows)
兼容性 SQL92
允許定位的 DELETE (刪除)語句:
DELETE FROM table WHERE
CURRENT OF cursor
這里 cursor 表示一個打開的游標. PostgreSQL 里交互式游標是只讀的.
----------------------------------------------------------------------------
----
DROP AGGREGATE
DROP AGGREGATE
Name
DROP AGGREGATE? --? 刪除一個用戶定義的聚集函數
Synopsis
DROP AGGREGATE name type
輸入
name
現存的聚集函數名。
type
現存的聚集函數的輸入數據類型,或者 * -- 如果這個聚集函數接受任意輸入類
型.(請參考 PostgreSQL 用戶手冊 獲取關于數據類型的更多信息)。
輸出
DROP
命令成功的返回信息.
ERROR: RemoveAggregate: aggregate 'name' for type type does not exist
如果聲明的函數在數據庫中不存在,返回此信息.
描述
DROP AGGREGATE將刪除對一個現存聚集函數的所有索引. 執行這條命令的用戶必須是
該聚集函數的所有者.
注意
使用 CREATE AGGREGATE語句創建一個聚集函數。
用法
將類型 int4的聚集函數 myavg 刪除:
DROP AGGREGATE myavg(int4);
兼容性 SQL92
在 中沒有 DROP AGGREGATE語句. 該語句是一個 PostgreSQL 語言的擴展.
----------------------------------------------------------------------------
----
DROP DATABASE
Name
DROP DATABASE? --? 刪除一個數據庫.
Synopsis
DROP DATABASE name
輸入
name
要被刪除的現有數據庫名.
輸出
DROP DATABASE
如果命令成功執行,返回此命令.
DROP DATABASE: cannot be executed on the currently open database
你不能和準備刪除的數據庫建立聯接.你需要和 template1 或者任何其它的數據庫相
連來運行這些命令.
DROP DATABASE: cannot be executed on the currently open database
執行這條命令之前你必須先結束正在處理的事務。
描述
DROP DATABASE刪除一個現存數據庫的目錄入口并且刪除包含數據的目錄.只有數據庫
所有者能夠執行這條命令(通常也是數據庫創建者).
DROP DATABASE不能撤銷,小心使用.
注意
這條命令在和目標數據庫聯接時不能執行. 通常更好的做法是用 dropdb腳本代替,該
腳本是此命令的一個封裝。 ,
請參考 CREATE DATABASE語句獲取如何創建數據庫的信息.
兼容性 SQL92
DROP DATABASE是一個 PostgreSQL 語言的擴展. 在 中沒有這條命令.
----------------------------------------------------------------------------
----
DROP FUNCTION
Name
DROP FUNCTION? --? 刪除一個用戶定義的函數
Synopsis
DROP FUNCTION name ( [ type [, ...] ] )
輸入
name
現存的函數名稱.
type
函數參數的類型.
輸出
DROP
命令成功執行的返回信息.
NOTICE RemoveFunction: Function "name" ("types") does not exist
如果當前數據庫里不存在所聲明的函數,返回此信息.
描述
DROP FUNCTION 將刪除一個現存的函數的引用.要執行這條命令,用戶必須是函數的所
有者. 必須聲明函數的輸入參數類型,因為幾個不同的函數可能會有同樣的名字 和不
同的參數列表.
注意
請參考 CREATE FUNCTION 獲取創建聚集函數的信息.
對依賴于該函數的類型, 操作符訪問方式或者觸發器是否事先被刪除不做任何校驗.
用法
這條命令刪除平方根函數:
DROP FUNCTION sqrt(int4);
兼容性 SQL92
DROP FUNCTION是 PostgreSQL 語言的擴展.
SQL/PSM
SQL/PSM 是一個為實現函數擴展能力而提出的標準. SQL/PSM DROP FUNCTION 語句有
下面的語法:
DROP [ SPECIFIC ] FUNCTION name { RESTRICT | CASCADE }
----------------------------------------------------------------------------
----
DROP GROUP
DROP GROUP
Name
DROP GROUP? --? 刪除一個用戶組
Synopsis
DROP GROUP name
輸入
name
現存組名。
輸出
DROP GROUP
成功刪除組后返回的信息。
描述
DROP GROUP從數據庫中刪除指定的組。組中的用戶不被刪除。 組中的用戶不被刪除。
使用 CREATE GROUP增加新組,用 ALTER GROUP修改組的成員。
用法
刪除一個組:
DROP GROUP staff;
兼容性 SQL92
里沒有 DROP GROUP.
----------------------------------------------------------------------------
----
DROP INDEX
Name
DROP INDEX? --? 刪除一個索引
Synopsis
DROP INDEX index_name [, ...]
輸入
index_name
要刪除的索引名.
輸出
DROP
如果索引成功刪除返回的信息.
ERROR: index "index_name" does not exist
如果 index_name 不是這個數據庫的索引,返回此信息.
描述
DROP INDEX從數據庫中刪除一個現存的索引. 要執行這個命令,你必須是索引的所有
者. the index.
注意
DROP INDEX是PostgreSQL 語言擴展.
請參考 CREATE INDEX語句獲取如何創建索引的信息.
用法
此命令將刪除title_idx 索引:
DROP INDEX title_idx;
兼容性 SQL92
定義用于訪問純關系型數據庫的命令. 索引是一個與具體實現相關的特性,因而沒有
與具體實現相關的特性或定義在 語言里面.
----------------------------------------------------------------------------
----
DROP LANGUAGE
DROP LANGUAGE
Name
DROP LANGUAGE? --? 刪除一個用戶定義的過程語言
Synopsis
DROP [ PROCEDURAL ] LANGUAGE 'name'
輸入
name
現存語言的名稱.
輸出
DROP
如果語言成功刪除,返回此信息.
ERROR: Language "name" doesn't exist
如果語言 name 沒有找到,返回此信息.
描述
DROP PROCEDURAL LANGUAGE將刪除曾注冊過的過程語言 name.
注意
DROP PROCEDURAL LANGUAGE語句是 PostgreSQL 語言的擴展.
請參考 CREATE LANGUAGE獲取如何創建過程語言的信息.
將不會校驗用這種語言注冊的函數或觸發器是否仍然存在. 要想重新使用這些東西而
不用刪除和重新創建所有這些函數, 函數 pg_proc 的 prolang字段/屬性必須調整為
為 PL 重新創建的 pg_language 入口的新對象標識( OID).
用法
下面命令刪除 PL/Sample 語言:
DROP PROCEDURAL LANGUAGE 'plsample';
兼容性 SQL92
在里沒有 DROP PROCEDURAL LANGUAGE.
----------------------------------------------------------------------------
----
DROP OPERATOR
DROP OPERATOR
Name
DROP OPERATOR? --? 刪除一個用戶定義操作符
Synopsis
DROP OPERATOR id ( lefttype | NONE , righttype | NONE )
輸入
id
一個現存的操作符的標識符.
lefttype
該操作符左參數的類型.如果該操作符沒有左參數, 寫 NONE.
righttype
該操作符右參數的類型.如果該操作符沒有右參數, 寫 NONE.
輸出
DROP
命令成功執行的返回函數.
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語句從數據庫中刪除一個現存的操作符. 要執行這個命令,你必須是操
作符所有者.
左目操作符的右類型或右目操作符的左類型可以聲明為 NONE.
注意
DROP OPERATOR語句是 PostgreSQL 語言擴展.
請參考 CREATE OPERATOR獲取如何創建操作符的信息.
刪除任何依賴于被刪除的操作符的訪問模式和操作符表是用戶的責任.
用法
將用于int4的冪操作符 a^n 刪除:
DROP OPERATOR ^ (int4, int4);
刪除用于boolean變量的左目取反操作符(! b):
DROP OPERATOR ! (none, bool);
刪除用于 int4的階乘 (! i) : int4:
DROP OPERATOR ! (int4, none);
兼容性 SQL92
在里沒有 DROP OPERATOR 語句.
----------------------------------------------------------------------------
----
DROP RULE
DROP RULE
Name
DROP RULE? --? 刪除一個重寫規則
Synopsis
DROP RULE name [, ...]
輸入
name
要刪除的現存的規則.
輸出
DROP
刪除成功返回的信息.
ERROR: Rule or view "name" not found
如果聲明的規則不存在,返回此信息.
描述
DROP RULE從聲明的 PostgreSQL規則系統里刪除一個規則. PostgreSQL 將立即停止使
用之并且將會把它從系統表中清理出去.
注意
DROP RULE語句是 PostgreSQL 語言的擴展.
請參考 CREATE RULE 獲取如何創建規則的信息.
一旦一個規則被刪除掉,該規則所寫的歷史記錄信息將可能不存在.
用法
刪除重寫規則 newrule:
DROP RULE newrule;
兼容性 SQL92
在 中沒有DROP RULE.
----------------------------------------------------------------------------
----
DROP SEQUENCE
DROP SEQUENCE
Name
DROP SEQUENCE? --? 刪除一個序列
Synopsis
DROP SEQUENCE name [, ...]
輸入
name
序列名.
輸出
DROP
序列成功刪除后返回的信息.
ERROR: sequence "name" does not exist
如果聲明的序列不存在,返回此信息.
描述
DROP SEQUENCE從數據庫中刪除序列號生成器. 因為目前的序列實現是作為一個特殊的
表,所以此語句就象 DROP TABLE 語句一樣.
注意
DROP SEQUENCE語句是 Postgres 語言擴展.
請參考 CREATE SEQUENCE 語句獲取如何創建一個序列的信息.
用法
從數據庫中刪除序列 serial:
DROP SEQUENCE serial;
兼容性 SQL92
在里沒有 DROP SEQUENCE.
----------------------------------------------------------------------------
----
DROP TABLE
DROP TABLE
Name
DROP TABLE? --? 刪除一個表
Synopsis
DROP TABLE name [, ...]
輸入
name
要刪除的現存表或視圖.
輸出
DROP
如果命令成功完成,返回此信息.
ERROR: table "name" does not exist
果聲明的表或視圖在數據庫中不存在.
描述
DROP TABLE從數據庫中刪除表或視圖. 只有其所有者才能刪除一個表或視圖. 使用
DELETE 一個表可能沒有任何行,但不會被刪除.
如果被刪除的表有從索引,它們將首先被刪除. 從索引的刪除將對所屬表的內容沒有
任何影響.
注意
請參考 CREATE TABLE 和 ALTER TABLE 獲取如何創建或更改表的信息.
用法
刪除 films 和 distributors表:
DROP TABLE films, distributors;
兼容性 SQL92
為 DROP TABLE 聲明了一些附加的功能:
DROP TABLE table { RESTRICT | CASCADE }
RESTRICT
確保只有不存在相關視圖或完整性約束的表才可以被刪除.
CASCADE
任何引用的視圖或完整性約束都將被刪除.
小技巧: 目前,要刪除一個視圖,你必須明確刪除之.
----------------------------------------------------------------------------
----
DROP TRIGGER
DROP TRIGGER
Name
DROP TRIGGER? --? 刪除一個觸發器定義.
Synopsis
DROP TRIGGER name ON table
輸入
name
現存的觸發器名.
table
表的名稱.
輸出
DROP
如果觸發器成功的刪除,返回此信息.
ERROR: DropTrigger: there is no trigger name on relation "table"
如果聲明的觸發器不存在,返回此信息.
描述
DROP TRIGGER將刪除所有對一個現存觸發器的引用. 要執行這個命令,當前用戶必須
是觸發器的所有者.
注意
DROP TRIGGER是 PostgreSQL 語言的擴展.
請參考 CREATE TRIGGER 獲取如何創建觸發器的信息.
用法
刪除表films的if_dist_exists觸發器:
DROP TRIGGER if_dist_exists ON films;
兼容性 SQL92
在里沒有DROP TRIGGER.
----------------------------------------------------------------------------
----
DROP TYPE
DROP TYPE
Name
DROP TYPE? --? 刪除一個用戶定義數據類型
Synopsis
DROP TYPE typename [, ...]
輸入
typename
現存的類型名.
輸出
DROP
命令執行成功的返回信息.
ERROR: RemoveType: type 'typename' does not exist
如果聲明的類型沒有找到,返回此信息.
描述
DROP TYPE將從系統表里刪除用戶的類型.
只有類型所有者可以刪除類型.
注意
DROP TYPE 語句是 PostgreSQL 語言的擴展.
請參考 CREATE TYPE 獲取如何創建類型的信息.
用戶有責任刪除任何使用了被刪除類型的操作符,函數,聚集,訪問模式, 子類型和
表.不過,相關等數組數據類型(由 CREATE TYPE 自動創建)將自動刪除.
如果刪除了一個內建的類型,后端的行為將不可預測.
用法
刪除 box 類型:
DROP TYPE box;
兼容性 SQL92
SQL3
DROP TYPE是 SQL3 語句.
----------------------------------------------------------------------------
----
DROP USER
DROP USER
Name
DROP USER? --? 刪除一個數據庫用戶帳號
Synopsis
DROP USER name
輸入
name
一個現存用戶的名稱.
輸出
DROP USER
用戶被成功刪除的返回信息.
ERROR: DROP USER: user "name" does not exist
如果用戶名沒有找到,返回此信息.
DROP USER: user "name" owns database "name", cannot be removed
你必須先刪除數據庫或者改變其所有者。
描述
DROP USER從數據庫中刪除指定的用戶。 它不刪除數據庫里此用戶所有的表,視圖或其
他對象。 如果該用戶擁有任何數據庫,你會收到一個錯誤信息。
使用 CREATE USER增加新用戶,用 ALTER USER修改用戶屬性。 PostgreSQL 還有一個
腳本 dropuser,這個腳本和這條命令功能相同(實際上,腳本里調用此命令),但是
可以在命令行上運行。
用法
刪除一個用戶帳戶:
DROP USER jonathan;
兼容性 SQL92
在里沒有DROP USER.
----------------------------------------------------------------------------
----
DROP VIEW
DROP VIEW
Name
DROP VIEW? --? 刪除一個視圖
Synopsis
DROP VIEW name [, ...] 輸入
name
現存視圖名稱.
輸出
DROP
命令成功執行的返回.
ERROR: view name does not exist
如果聲明的視圖在數據庫中不存在,返回此信息.
描述
DROP VIEW從數據庫中刪除一個現存的視圖. 執行這條命令必須是視圖的所有者.
注意
請參考CREATE VIEW 獲取關于如何創建視圖的信息.
用法
下面命令將刪除視圖 kinds:
DROP VIEW kinds; 兼容性 SQL92
為 DROP VIEW 聲明了一些附加的功能:
DROP VIEW view { RESTRICT | CASCADE }??? 輸入
RESTRICT
確保只有不存在關聯視圖或完整性約束的視圖可以被刪除.
CASCADE
任何引用的視圖和完整性約束都將被刪除.
注意
目前,要從 PostgreSQL 數據庫中刪除一個視圖, 你必須明確地將其刪除.
----------------------------------------------------------------------------
----
END
Name
END? --? 提交當前的事務
Synopsis
END [ WORK | TRANSACTION ]
輸入
WORK
TRANSACTION
可選關鍵字。沒有作用。
輸出
COMMIT
事務成功提交后的返回信息。
NOTICE: COMMIT: no transaction in progress
如果沒有正在處理的事務,返回此信息。
描述
END是 PostgreSQL 而 -兼容的同義語句是 COMMIT.
注意
關鍵字 WORK 和 TRANSACTION 是多余的,可以省略。
使用 ROLLBACK退出一個事務。
用法
令所有改變生效:
END WORK;
兼容性 SQL92
END是 PostgreSQL 的擴展,提供與 COMMIT相同的功能。
----------------------------------------------------------------------------
----
EXPLAIN
EXPLAIN
Name
EXPLAIN? --? 顯示語句執行規劃
Synopsis
EXPLAIN [ VERBOSE ] query
輸入
VERBOSE
顯示詳細查詢規劃的標志.
query
任何 query (查詢).
輸出
NOTICE: QUERY PLAN: plan
PostgreSQL 后端明確的查詢規劃.
EXPLAIN
查詢規劃顯示后發送的標志.
描述
這條命令顯示PostgreSQL規劃器為所提供的查詢生成的執行規劃。執行規劃顯示查詢引
用的表是如何被掃描的--- 是簡單的順序掃描,還是 索引掃描等 --- 并且如果引用了
多個表, 采用了什么樣的連接算法從每個輸入的表中取出所需要的記錄。
顯示出來的最關鍵的部分是預計的查詢執行開銷, 這就是規劃器對運行該查詢所需時
間的估計(以磁盤頁面存取為單位計量)。實際上顯示了兩個數字:返回第一條記錄前
的啟動時間, 和返回所有記錄的總時間。對于大多數查詢而言,關心的是總時間,但
是, 在某些環境下,比如一個 EXISTS 子查詢里, 規劃器將選擇最小啟動時間而不是
最小總時間 (因為執行器在獲取一條記錄后總是要停下來)。同樣, 如果你用一條
LIMIT 子句限制返回的記錄數, 規劃器會在最終的開銷上做一個合理的插值以計算哪
個規劃開銷最省。
VERBOSE 選項輸出規劃樹在系統內部的完整內容, 而不僅僅是一個概要(并且還把它
發送給 postmaster 日志文件)。 通常這個選項只是對調試PostgreSQL有用。
注意
在 PostgreSQL 中只有很少的關于使用優化器的開銷的文檔.通常的關于查詢優化的開
銷的估算可以在數據庫的手冊中找到. 請參考 程序員手冊 中關于索引和基因查詢優
化器的章節獲取更多信息.
用法
顯示一個對只有一個 int4 列和 128 行的表的簡單查詢的查詢規劃:
EXPLAIN SELECT * FROM foo;
NOTICE: QUERY PLAN:
Seq Scan on foo (cost=0.00..2.28 rows=128 width=4)
EXPLAIN
對同一個擁有支持查詢 equijoin 條件的索引的表, EXPLAIN 將顯示一個不同的規
劃:
EXPLAIN SELECT * FROM foo WHERE i = 4;
NOTICE: QUERY PLAN:
Index Scan using fi on foo (cost=0.00..0.42 rows=1 width=4)
EXPLAIN
最后,同一個擁有支持查詢 equijoin 條件的索引的表, EXPLAIN對使用一個聚集函數
的查詢將顯示下面內容:
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)
注意這里顯示的數字, 甚至還有選擇的查詢策略都有可能在各個 PostgreSQL版本之間
不同--因為規劃器在不斷改進。
兼容性 SQL92
在 中沒有EXPLAIN 語句.
----------------------------------------------------------------------------
----
FETCH
Name
FETCH? --? 用游標從表中抓取行
Synopsis
FETCH [ direction ] [ count ] { IN | FROM } cursor
FETCH [ FORWARD | BACKWARD | RELATIVE ] [ # | ALL | NEXT | PRIOR ] { IN |
FROM } cursor
輸入
direction
selector定義抓取的方向.它可以是下述之一:
FORWARD
抓取后面的行. selector 省略時這是缺省值.
BACKWARD
抓取前面行.
RELATIVE
為 兼容設置的多余鍵字.
count
count決定抓取幾行.可以是下列之一:
#
一個表明抓取幾行的整數. 注意負整數等效于改變 FORWARD 和 BACKWARD 屬性.
ALL
檢索所有剩余的行.
NEXT
等效于聲明 count 為 1.
PRIOR
等效于聲明 count 為 -1.
cursor
一個打開的游標的名稱.
輸出
FETCH返回由聲明游標定義的查詢結果. 如果查詢失敗,將返回下面的信息:
NOTICE: PerformPortalFetch: portal "cursor" not found
如果 cursor 在前面沒有定義,返回此信息.游標必須在一個事務塊中定義.
NOTICE: FETCH/ABSOLUTE not supported, using RELATIVE
PostgreSQL 不支持游標的絕對定位.
ERROR: FETCH/RELATIVE at current position is not supported
允許我們用下面語句在"當前位置"不停地檢索游標
FETCH RELATIVE 0 FROM cursor.
PostgreSQL 目前不支持這種用法;實際上,零被保留用于檢索所有行, 等效于聲明
ALL 關鍵字.如果使用 RELATIVE 關鍵字, PostgreSQL 假設用戶試圖使用 的特性,
因而返回此錯誤.
描述
FETCH允許用戶使用游標檢索行.所要檢索的行數用 # 聲明.如果游標中剩下的行小于
#, 那么只有那些可用的抓過來.用關鍵字 ALL 代替數字將導致游標中所有剩余行被
抓過來. 記錄可以 FORWARD (向前)抓,也可以 BACKWARD (向后)抓.缺省的方向
是 FORWARD (向前).
注意: 可以用負數作為行記數, 符號等效于顛倒抓取方向關鍵字(FORWARD 和
BACKWARD).例如, FORWARD -1 等效于 BACKWARD 1.
注意
注意 FORWARD 和 BACKWARD 關鍵字是 PostgreSQL 擴展. 語法也支持,在此命令的第
二種形式中聲明. 詳細的兼容性 SQL92 信息見下面.
在游標中更新數據還不被 PostgreSQL, 支持,因為將游標更新影射回基本表是不太可
能的,這一點對 VIEW 更新也一樣.因而用戶必須顯式的使用 UPDATE 命令來更新數
據.
游標只能用于事務內部,因為它們存儲的數據跨越了多個用戶的查詢.
使用 MOVE語句改變游標位置.使用 DECLARE語句定義一個游標.使用 BEGIN,
COMMIT, 和 ROLLBACK語句獲取更多關于事務的信息.
用法
下面的例子用一個游標跨過一個表。
-- 建立一個游標:
BEGIN WORK;
DECLARE liahona CURSOR FOR SELECT * FROM films;
-- 抓取頭 5 行到游標 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
-- 關閉游標并提交事務:
CLOSE liahona;
COMMIT WORK;
兼容性 SQL92
注意: 非嵌入式游標的使用是 PostgreSQL 擴展.游標的語法和用途與定義與 里定義
的嵌入式用法相似。
允許游標在 FETCH 中的絕對定位, 并且允許將結果放在明確的變量里:
FETCH ABSOLUTE #
FROM cursor
INTO :variable [, ...]
ABSOLUTE
游標將放置在寫明的絕對的行數的位置上.在 PostgreSQL 中所有的行數都是相對數
量,所以這一功能不支持.
:variable
目標宿主變量.
----------------------------------------------------------------------------
----
GRANT
Name
GRANT? --? 定義訪問權限
Synopsis
GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] objectname [, ...]??? TO { username | GROUP groupname |
PUBLIC } [, ...]
描述
GRANT命令將某對象(表,視圖,序列) 上的特定權限給予一個用戶或者多個用戶或者一
組用戶.這些權限將增加到那些已經賦予的權限上,如果存在這些權限的話.
鍵字 PUBLIC 表示該權限要賦予所有用戶, 包括那些以后可能創建的用戶.PUBLIC 可
以看做是一個隱含定義好的組,它總是包括所有用戶.請注意,任何特定的用戶都將擁
有直接賦予他/她的權限,加上 他/她所處的任何組,以及再加上賦予 PUBLIC 的權限
的總和.
在創建完對象之后,除了對象的創建者之外, 其它用戶沒有任何訪問該對象的權限,
除非創建者賦予某些權限. 對對象的創建者而言,沒有什么權限需要賦予,因為創建
者自動持有所有權限.(不過,創建者出于安全考慮可以選擇 廢棄一些他自己的權
限.請注意賦予和廢止權限的能力是創建者與生具來的,并且不會丟失.刪除對象的權
利也是創建者固有的,并且不能賦予或 撤銷.)
可能的權限有∶
SELECT
允許對聲明的表,試圖,或者序列 SELECT 仁義字段.還允許做 COPY 的源.
INSERT
允許向聲明的表 INSERT 一個新行. 同時還允許做 COPY 的目標.
UPDATE
允許對聲明的表中任意字段做 UPDATE . SELECT ... FOR UPDATE 也要求這個權限
(除了 SELECT 權限之外).比如, 這個權限允許使用nextval, currval 和 setval.
DELETE
允許從聲明的表中 DELETE 行.
RULE
允許在該表/視圖上創建規則.(參閱 CREATE RULE 語句.)
REFERENCES
要在一個表上創建一個外鍵約束,你必須在帶參考健字的表上 擁有這個權限.
TRIGGER
允許在聲明表上創建觸發器.(參閱 CREATE TRIGGER 語句.)
ALL PRIVILEGES
把上面所有權限都一次賦予.PRIVILEGES 關鍵字在 PostgreSQL 里是可選的, 但是嚴
格的 SQL 要求有這個關鍵字.
其它命令要求的權限都在相應的命令的參考頁上列出.
注意
我們要注意數據庫 superusers 可以訪問所有對象, 而不會受對象的權限設置影
響.這個特點類似 Unix 系統的 root 的權限.和 root 一樣,除了必要的情況,總是
以超級用戶 身分進行操作是不明智的做法.
目前,要在 PostgreSQL 里只對某幾列 賦予權限,你必須創建一個擁有那幾行的視圖
然后給那個視圖賦予權限.
使用 psql的 /z 命令 獲取在現有對象上的與權限有關的信息.
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 命令刪除訪問權限.
例子
把表 films 的插入權限賦予所有用戶∶
GRANT INSERT ON films TO PUBLIC;
賦予用戶manuel對視圖kinds的所有權限∶
GRANT ALL PRIVILEGES ON kinds TO manuel;
兼容性 SQL92
在 ALL PRIVILEGES 里的 PRIVILEGES 關鍵字是必須的.SQL 不支持在一條命令里 對
多個表設置權限.
的 GRANT 語法允許在一個表里 為獨立的字段設置權限,并且允許設置一個權限用來
給其它人賦予同樣的權限∶
GRANT privilege [, ...]
ON object [ ( column [, ...] ) ] [, ...]
TO { PUBLIC | username [, ...]
} [ WITH GRANT OPTION ]
SQL 允許對其它類型的對象賦予 USAGE 權限∶CHARACTER SET,COLLATION,
TRANSLATION,DOMAIN.
TRIGGER 權限是 SQL99 引入的.RULE 權限是 PostgreSQL 擴展.
又見
REVOKE
----------------------------------------------------------------------------
----
INSERT
Name
INSERT? --? 在表中創建新行
Synopsis
INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( expression [, ...] ) | SELECT query }
輸入
table
現存表的名稱.
column
表 table 中的列/字段名.
DEFAULT VALUES
所有字段都會用NULL或者創建表時用DEFAULT子句聲明的值填充.
expression
賦予 column 的一個有效表達式或值.
query
一個有效的查詢.請參考 SELECT 語句獲取有效參數的進一步描述.
輸出
INSERT oid 1
如果只插入了一行,返回此信息. oid OID 是被插入行的數字標識.
INSERT 0 #
如果插入了超過一行,返回此信息. # 是插入的行數.
描述
INSERT允許我們向表中插入新行. 我們可以一次插入一行或多行作為查詢結果. 目標
列表中的列/字段可以按任何順序排列.
在目標列中沒有出現的列/字段將插入缺省值, 要么是定義了的 DEFAULT 值或者
NULL。 如果向定義為 NOT NULL 的列中插入 NULL 值, PostgreSQL 將拒絕新列。
如果每行的表達式不是正確的數據類型,將試圖進行自動的類型轉換.
要想向表中插入數據,你必須有插入權限, 同樣也要有選擇權限用于處理 WHERE 子句
里聲明的任何表。
用法
向表 films 里插入一行:
INSERT INTO films VALUES
('UA502','Bananas',105,'1971-07-13','Comedy',INTERVAL '82 minute');
在第二個例子里面省略了字段 len 因此在它里面將只存儲缺省的 NULL 值:
INSERT INTO films (code, title, did, date_prod, kind)
VALUES ('T_601', 'Yojimbo', 106, DATE '1961-06-16', 'Drama');
向表 distributors 里插入一行;注意只聲明了字段 name ,而沒有聲明的字段 did
將被賦于它的缺省值:
INSERT INTO distributors (name) VALUES ('British Lion');
從表 tmp 中插入幾行到表 films 中:
INSERT INTO films SELECT * FROM tmp;
插入數組(請參考 PostgreSQL 用戶手冊 獲取關于數組的更多信息):
-- 創建一個空的 3x3 游戲板來玩圈-和-叉游戲
-- (所有這些查詢創建相同的板屬性)
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語句與 完全兼容. 可能碰到的關于 query 子句特性的限制在 SELECT語句中有
相關文檔.
問題未解決?付費解決問題加Q或微信 2589053300 (即Q號又微信號)右上方掃一掃可加博主微信
所寫所說,是心之所感,思之所悟,行之所得;文當無敷衍,落筆求簡潔。 以所舍,求所獲;有所依,方所成!