亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

SQL大全[2]

2024-07-21 02:44:50
字體:
來源:轉載
供稿:網友
用法
下面命令定義一個新操作符,面積相等,用于 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,那么每條語句之后就檢查它.這個是缺?。绻s束是 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 (喜?。╇娪敖M成的視圖:
CREATE VIEW kinds AS
    SELECT *
    FROM films
    WHERE kind = 'Comedy';
SELECT * FROM kinds;

code |           title          | did | date_prod | kind | len
-------+---------------------------+-----+------------+--------+-------
UA502 | Bananas                   | 105 | 1971-07-13 | Comedy | 01:22
C_701 | There's a Girl in my Soup | 107 | 1970-06-11 | Comedy | 01:36
(2 rows)   
兼容性 SQL92   
為 CREATE VIEW 聲明了一些附加的功能:
CREATE VIEW view [ column [, ...] ]
    AS SELECT expression [ AS colname ] [, ...]
    FROM table [ WHERE condition ]
    [ WITH [ CASCADE | LOCAL ] CHECK OPTION ]   
完整的命令可選的子句是:
CHECK OPTION
這個選項用于可更新視圖. 所有對視圖的 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語句中有相關文檔.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人免费网| 538国产精品视频一区二区| 欧美一级电影免费在线观看| 日韩电影视频免费| 精品一区二区三区四区在线| 精品日本美女福利在线观看| 国产日韩在线精品av| 日韩美女视频免费在线观看| 欧美性猛交丰臀xxxxx网站| 国产69精品久久久久99| 亚洲精品91美女久久久久久久| 色午夜这里只有精品| 日韩高清不卡av| 亚洲国产成人一区| 色婷婷综合成人av| 国产亚洲激情视频在线| 琪琪亚洲精品午夜在线| 欧美精品videossex88| 亚洲视频第一页| 欧美性视频网站| 成人女保姆的销魂服务| 日韩在线中文字| 韩国三级电影久久久久久| 欧美成aaa人片在线观看蜜臀| 欧美做受高潮1| 国产亚洲欧美一区| 国内外成人免费激情在线视频网站| 中文字幕亚洲综合久久筱田步美| 久久久久久伊人| 情事1991在线| 久久久久久中文| 国产网站欧美日韩免费精品在线观看| 中文字幕亚洲自拍| 精品国内自产拍在线观看| 国产亚洲欧美视频| 一区二区三区四区精品| 久久国产精品免费视频| 国产精品高潮呻吟久久av野狼| 韩国美女主播一区| 91亚洲国产精品| 亚洲精品av在线| 欧美另类在线观看| 国产精品久久久久免费a∨大胸| 91视频九色网站| 国产精品久久婷婷六月丁香| 2019中文字幕在线观看| www.国产精品一二区| 亚洲最大福利视频网站| 亚洲а∨天堂久久精品9966| 国产精品18久久久久久麻辣| 综合激情国产一区| 成人欧美一区二区三区黑人| 欧美日韩亚洲成人| 欧美性在线视频| 国产午夜精品全部视频在线播放| 欧美性xxxxxx| 国产精品日韩电影| 欧美激情亚洲国产| 91大神在线播放精品| 亚洲a区在线视频| 久久久久久这里只有精品| 51ⅴ精品国产91久久久久久| 4444欧美成人kkkk| 91精品视频免费观看| 97在线免费观看| 国产成人精品免高潮在线观看| 性欧美亚洲xxxx乳在线观看| 国产精品久久97| 一区二区三区国产视频| 国产在线视频91| 久久影视免费观看| 欧美激情女人20p| 欧美亚洲第一页| 欧美高清电影在线看| 欧美一级电影在线| 日韩欧美国产一区二区| 日韩av免费在线播放| 久久电影一区二区| 亚洲日本成人女熟在线观看| 久久久精品一区二区三区| 精品久久久久久久久久国产| 亚洲专区国产精品| 国产欧美日韩高清| 日韩欧美在线国产| 精品视频久久久久久| 亚洲视频视频在线| 亚洲视频一区二区| 91沈先生在线观看| 亚洲成年人影院在线| 国产一区二区在线免费视频| 日本欧美精品在线| 亚洲激情视频网| 国模私拍视频一区| 精品久久久久久久久久| 亚洲性视频网址| 欧美日本国产在线| 久久精品久久久久电影| 欧美丰满少妇xxxxx做受| 国产精品视频精品视频| 国产福利视频一区| 国产欧美日韩中文字幕在线| 国产欧美日韩91| 国产精品小说在线| 91sa在线看| 亚洲精品一区中文字幕乱码| 国产日本欧美视频| 热久久免费国产视频| 狠狠色狠狠色综合日日小说| 国产精品wwwwww| 中文字幕日韩欧美精品在线观看| 精品视频一区在线视频| 国产精品久久在线观看| 亚洲xxxxx性| 最近2019年中文视频免费在线观看| 亚洲国产精品专区久久| 国产精品爽黄69| 久久久极品av| 亚洲小视频在线观看| 午夜精品一区二区三区av| 国产高清在线不卡| 亚洲欧美成人在线| 国产精品直播网红| 亚洲成人性视频| 亚洲精品永久免费| 久久久久久久久久国产精品| 亚洲欧美激情一区| 国产精品久久久久久久9999| 在线一区二区日韩| 欧美另类极品videosbestfree| 中文字幕日韩高清| 91成人天堂久久成人| 成人在线国产精品| 国产aaa精品| 国产在线98福利播放视频| 久久久久久亚洲| 另类少妇人与禽zozz0性伦| 精品电影在线观看| 久久精品国产69国产精品亚洲| 欧美一区二区三区艳史| 久久久天堂国产精品女人| 欧美激情视频给我| 日韩在线观看成人| 一区二区三区日韩在线| 揄拍成人国产精品视频| 成人天堂噜噜噜| 亚洲免费av电影| 最新国产精品亚洲| 92看片淫黄大片欧美看国产片| 全色精品综合影院| 国产成人一区二区| 欧美成人午夜激情视频| 久久成人18免费网站| 欧美日韩不卡合集视频| 精品久久久久久中文字幕大豆网| 日韩免费看的电影电视剧大全| 中文字幕欧美精品在线| 国产亚洲精品久久久优势| 亚洲精品国产精品国产自| 国产精品九九九| 欧美wwwwww| 亚洲第一视频网| 久久久在线观看| 成人a级免费视频| 亚洲第一二三四五区|