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

首頁(yè) > 數(shù)據(jù)庫(kù) > SQL Server > 正文

SQL大全[2]

2019-11-03 08:36:19
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
用法
下面命令定義一個(gè)新操作符,面積相等,用于 BOX 數(shù)據(jù)類型.
CREATE OperaTOR === (
   LEFTARG = box,
   RIGHTARG = box,
   PROCEDURE = area_equal_procedure,
   COMMUTATOR = ===,
   NEGATOR = !==,
   RESTRICT = area_restriction_procedure,
   JOIN = area_join_procedure,
   HASHES,
   SORT1 = <<<,
   SORT2 = <<<
);
兼容性 SQL92   
CREATE OPERATOR是 PostgreSQL 擴(kuò)展. 在中沒(méi)有 CREATE OPERATOR 語(yǔ)句.

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

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

這里 action 可以是:

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

輸入
name
創(chuàng)建的規(guī)則名.
event
事件是 SELECT, UPDATE,DELETE 或 INSERT 之一.
object
對(duì)象是 table 或 table.column.(目前只有 table 形式實(shí)際上是實(shí)現(xiàn)了的.
condition
任意 SQL 布爾條件表達(dá)式.條件表達(dá)式除了引用 new 和 old 之外不能引用任何表.
query
組成 action 的查詢可以是任何 SQL SELECT,INSERT, UPDATE,DELETE,或 NOTIFY 語(yǔ)句之一.
在 condition 和 action 里,特殊表名字 new 和 old 可以用于指向引用表 ( object) 里的數(shù)值 new 在 ON INSERT 和 ON UPDATE 規(guī)則里 可以指向被插入或更新的新行. old 在 ON UPDATE,和 ON DELETE 規(guī)則里可以指向現(xiàn)存的被更新,或者刪除的行.
輸出
CREATE
成功創(chuàng)建規(guī)則后的返回信息.
描述
PostgreSQL 規(guī)則系統(tǒng) 允許我們?cè)趶?a href="http://www.survivalescaperooms.com/sql.asp">數(shù)據(jù)庫(kù)或表中更新, 插入或刪除東西時(shí)定義一個(gè)可選的動(dòng)作來(lái)執(zhí)行。目前,規(guī)則用于實(shí)現(xiàn)表視圖。
規(guī)則的語(yǔ)意是在一個(gè)單獨(dú)的記錄正被訪問(wèn),更新,插入或刪除時(shí), 將存在一個(gè)舊記錄(用于檢索,更新和刪除)和一個(gè)新記錄(用于更新和追加).這時(shí)給定事件類型和給定目標(biāo)對(duì)象(表)的所有規(guī)則都將被檢查, (順序不定). 如果在 WHERE (如果有)子句里面所聲明的 condition? 為真,那么 action 部分的規(guī)則就被執(zhí)行. 如果聲明了 INSTEAD,那么 action 就會(huì)代替原來(lái)的查詢;否則,如果是 ON INSERT 那么它在原來(lái)的查詢之后執(zhí)行,如果是 ON UPDATE 或者 ON DELETE,那么它在原來(lái)的查詢之前執(zhí)行.在 condition 和 action 里面, 在舊記錄里字段的數(shù)值和/或新記錄里字段的數(shù)值被 old. attribute-name 和 new. attribute-name 代替.
規(guī)則的 action 部分可以由一條或者多條查詢組成.要寫(xiě)多個(gè)查詢,用圓括弧或者方括弧 把它們包圍起來(lái).這樣的查詢將以聲明的順序執(zhí)行(只是我們不能保證對(duì)一個(gè)對(duì)象的多個(gè)規(guī)則的執(zhí)行順序). action 還可以是 NOTHING 表示沒(méi)有動(dòng)作.因此,一個(gè) DO INSTEAD NOTHING 規(guī)則制止了原來(lái)的查詢的運(yùn)行(當(dāng)條件為真時(shí)); DO NOTHING 規(guī)則是沒(méi)有用的.
規(guī)則的 action 部分 執(zhí)行的時(shí)候帶有和觸發(fā)動(dòng)作的用戶命令相同的命令和事務(wù)標(biāo)識(shí)符.
規(guī)則和視圖
目前,ON SELECT 規(guī)則必須是無(wú)條件的 INSTEAD 規(guī)則并且 必須有一個(gè)由一條 SELECT 查詢組成的動(dòng)作.因此,一條 ON SELECT 規(guī)則有效地把對(duì)象表轉(zhuǎn)成視圖,它的可見(jiàn)內(nèi)容 是規(guī)則的 SELECT 查詢返回的記錄而不是存儲(chǔ)在表中的內(nèi)容(如果有的話).我們認(rèn)為寫(xiě)一條 CREATE VIEW 命令比創(chuàng)建一個(gè)表然后定義一條 ON SELECT 規(guī)則在上面的風(fēng)格要好.
CREATE VIEW 創(chuàng)建一個(gè)虛擬表(沒(méi)有下層的存儲(chǔ)) 以及相關(guān)的 ON SELECT 規(guī)則.系統(tǒng)不允許對(duì)視圖進(jìn)行更新,因?yàn)樗涝谝晥D上沒(méi)有真正的表.你可以創(chuàng)建一個(gè)可以更新的視圖的幻覺(jué), 方法是在視圖上定義 ON INSERT,ON UPDATE,和 ON DELETE 規(guī)則 (或者滿足你需要的任何上述規(guī)則的子集),用合適的對(duì)其它表的更新替換 在視圖上更新的動(dòng)作.
如果你想在視圖更新上使用條件規(guī)則,那么這里就有一個(gè)補(bǔ)充∶ 對(duì)你希望在視圖上允許的每個(gè)動(dòng)作,你都必須有一個(gè)無(wú)條件的 INSTEAD 規(guī)則.如果規(guī)則是有條件的,或者它不是 INSTEAD, 那么系統(tǒng)仍將拒絕執(zhí)行更新動(dòng)作的企圖,因?yàn)樗J(rèn)為它最終會(huì)在某種 程度上在虛擬表上執(zhí)行動(dòng)作.如果你想處理?xiàng)l件規(guī)則上的所由有用的情況,那也可以;只需要增加一個(gè)無(wú)條件的 DO INSTEAD NOTHING 規(guī)則確保系統(tǒng)明白它將決不會(huì)被調(diào)用來(lái)更新虛擬表就可以了.然后把條件規(guī)則做成非 INSTEAD; 在這種情況下,如果它們被觸發(fā),那么它們就增加到缺省的 INSTEAD NOTHING 動(dòng)作中.



注意
為了在表上定義規(guī)則,你必須有規(guī)則定義權(quán)限. 用 GRANT 和 REVOKE 修改權(quán)限.
有一件很重要的事情是要避免循環(huán)規(guī)則. 比如,盡管下面兩條規(guī)則定義都是 PostgreSQL 可以接受的, select 命令會(huì)導(dǎo)致 PostgreSQL 報(bào)告 一條錯(cuò)誤信息,因?yàn)樵摬樵冄h(huán)了太多次:
CREATE RULE bad_rule_combination_1 AS
    ON SELECT TO emp
    DO INSTEAD
        SELECT * FROM toyemp;
CREATE RULE bad_rule_combination_2 AS
    ON SELECT TO toyemp
    DO INSTEAD
        SELECT * FROM emp;
下面這個(gè)對(duì) EMP 的查詢企圖將導(dǎo)致 PostgreSQL 產(chǎn)生一個(gè)錯(cuò)誤信息, 因?yàn)樵摬樵冄h(huán)了太多次:
SELECT * FROM emp;
目前,如果一個(gè)規(guī)則包含一個(gè) NOTIFY 查詢,那么該 NOTIFY 將被 無(wú)條件執(zhí)行 --- 也就是說(shuō),如果規(guī)則不施加到任何行上頭,該 NOTIFY 也會(huì)被發(fā)出.比如,在
CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable;
UPDATE mytable SET name = 'foo' WHERE id = 42;      
里,一個(gè) NOTIFY 事件將在 UPDATE 的時(shí)候發(fā)出,不管是否有某行的 id = 42.這是一個(gè)實(shí)現(xiàn)的限制,將來(lái)的版本應(yīng)該修補(bǔ)這個(gè)毛病.
兼容性 SQL92   
CREATE RULE語(yǔ)句是 PostgreSQL 語(yǔ)言的擴(kuò)展. 在里沒(méi)有CREATE RULE 語(yǔ)句.

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

CREATE SEQUENCE
CREATE SEQUENCE
Name
CREATE SEQUENCE  --  創(chuàng)建一個(gè)新的序列發(fā)生器
Synopsis
CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT increment ]
    [ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
    [ START start ] [ CACHE cache ] [ CYCLE ]
輸入
TEMPORARY 或 TEMP
如果聲明了這個(gè)修飾詞,那么該序列對(duì)象只為這個(gè)會(huì)話創(chuàng)建, 并且在會(huì)話結(jié)束的時(shí)候自動(dòng)刪除.在臨時(shí)序列存在的時(shí)候, 同名永久序列是不可見(jiàn)的(在同一會(huì)話里).
seqname
將要?jiǎng)?chuàng)建的序列號(hào)名.
increment
INCREMENT increment 子句是可選的.一個(gè)正數(shù)將生成一個(gè)遞增的序列, 一個(gè)負(fù)數(shù)將生成一個(gè)遞減的序列.缺省值是一(1).
minvalue
可選的子句 MINVALUE minvalue 決定一個(gè)序列可生成的最小值.缺省分別是遞增序列為 1 遞減為 -2^63-1.
maxvalue
使用可選子句 MAXVALUE maxvalue 決定序列的最大值.缺省的分別是遞增為 -2^63-1,遞減為 -1.
start
可選的 START start 子句 使序列可以從任意位置開(kāi)始.缺省初始值是遞增序列為 minvalue 遞減序列為 maxvalue.
cache
CACHE cache 選項(xiàng)使序列號(hào)預(yù)分配并且為快速訪問(wèn)存儲(chǔ)在內(nèi)存里面. 最小值(也是缺省值)是1(一次只能生成一個(gè)值, 也就是說(shuō)沒(méi)有緩存).
CYCLE
可選的 CYCLE 關(guān)鍵字可用于使序列到達(dá) 最大值(maxvalue) 或 最小值(minvalue)時(shí)可復(fù)位并繼續(xù)下去.如果達(dá)到極限,生成的下一個(gè)數(shù)據(jù)將分別是 最小值(minvalue) 或 最大值(maxvalue).如果沒(méi)有 CYCLE,那么在到達(dá)極限之后再調(diào)用 nextval 將返回錯(cuò)誤.
輸出
CREATE
命令成功執(zhí)行的返回信息.
ERROR: Relation 'seqname' already exists
如果聲明的序列已經(jīng)存在.
ERROR: DefineSequence: MINVALUE (start) can't be >= MAXVALUE (max)
如果聲明的初始值超出范圍,返回此信息.
ERROR: DefineSequence: START value (start) can't be < MINVALUE (min)
如果聲明的初始值超出范圍,返回此信息.
ERROR: DefineSequence: MINVALUE (min) can't be >= MAXVALUE (max)
如果最小值和最大值不連貫.
描述
CREATE SEQUENCE將向當(dāng)前數(shù)據(jù)庫(kù)里增加一個(gè)新的序列號(hào)生成器. 包括創(chuàng)建和初始化一個(gè)新的名為 seqname的 單行表.生成器將為使用此命令的用戶"所有".
在序列創(chuàng)建后,你可以使用函數(shù) nextval, currval 和 nextval 操作序列.這些函數(shù)在用戶手冊(cè)中有詳細(xì)文檔.
盡管你不能直接更新一個(gè)序列,但你可以使用象
SELECT * FROM seqname;
   
檢查一個(gè)序列的參數(shù)和當(dāng)前狀態(tài).特別是序列的 last_value 字段顯示了任意后端進(jìn)程分配的最后的數(shù)值. (當(dāng)然,這些值在被打印出來(lái)的時(shí)候可能已經(jīng)過(guò)時(shí)了 --- 如果其它進(jìn)程 正積極地使用 nextval.)
Caution
如果用語(yǔ)序列對(duì)象的cache 設(shè)置大于一, 而且該對(duì)象可能被多個(gè)后端同時(shí)使用就有可能產(chǎn)生不可預(yù)料的結(jié)果.每個(gè)后端在訪問(wèn)過(guò)序列對(duì)象并遞增序列對(duì)象的 last_value 后, 將分配跟在序列值后面"緩存數(shù)".這樣,該后端在下面的 cache-1 次nextval調(diào)用將使用預(yù)分配好的數(shù)值, 而不對(duì)共享對(duì)象做任何更新. 所以,任何已經(jīng)分配但在會(huì)話中沒(méi)有使用的數(shù)字將在會(huì)話結(jié)束時(shí)丟失.而且,盡管多個(gè)后端保證分配獨(dú)立的序列值, 當(dāng)考慮所有的后端時(shí)該數(shù)值卻有可能是亂序的.(例如,設(shè)置 cache為10, 后端 A 可能保留數(shù)值 1..10 并且返回nextval=1, 而后端 B 可能保留數(shù)值 11..20 并在后端 A 生成nextval=2 之前返回 nextval=11.)因此, 將cache 設(shè)為一可以安全地假設(shè)nextval的數(shù)值是順序生成的; 當(dāng)緩存數(shù)設(shè)置大于一,我們只能假設(shè)nextval值都是獨(dú)立的, 而不能假設(shè)它們都是純粹順序生成的. 同樣,last_value將反映由任何后端保留的最后數(shù)值,不管它是不是nextval曾返回過(guò)的. 另外一個(gè)問(wèn)題是在這樣的序列上執(zhí)行的 setval 將不會(huì)被其它后端知曉,直道它們用光所有預(yù)先分配的緩存數(shù)值.  

注意
使用 DROP SEQUENCE 語(yǔ)句來(lái)刪除序列.
序列是基于 bigint 運(yùn)算的,因此其范圍不能超過(guò)八字節(jié)的 整數(shù)范圍(-9223372036854775808 到 9223372036854775807).在一些老一點(diǎn)的平臺(tái)上可能沒(méi)有對(duì)八字節(jié)整數(shù)的編譯器支持, 這種情況下序列使用普通的 integer 運(yùn)算(范圍是 -2147483648 到 +2147483647).
如果 cache 大于一,那么每個(gè)后端使用其自身的緩存來(lái)存儲(chǔ)分配的數(shù)字. 已分配但當(dāng)前會(huì)話沒(méi)有使用的數(shù)字將丟失,導(dǎo)致序列里面出現(xiàn)"空洞".
用法
創(chuàng)建一個(gè)叫 serial的遞增序列,從101開(kāi)始:
CREATE SEQUENCE serial START 101;
從此序列中選出下一個(gè)數(shù)字:
SELECT nextval ('serial');    
nextval
-------
    114   
在一個(gè) INSERT 中使用此序列:
INSERT INTO distributors VALUES (nextval('serial'),'nothing');   
在一個(gè) COPY FROM 后更新序列:
BEGIN;
    COPY distributors FROM 'input_file';
    SELECT setval('serial', max(id)) FROM distributors;
END;   
兼容性 SQL92   
CREATE SEQUENCE是 PostgreSQL 語(yǔ)言擴(kuò)展. 在里沒(méi)有 CREATE SEQUENCE 語(yǔ)句.

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

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

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

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

這里 column_constraint 可以是:

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

而 table_constraint 可以是:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

里沒(méi)有 DROP GROUP.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Aggregate (cost=0.42..0.42 rows=1 width=4)
-> Index Scan using fi on foo (cost=0.00..0.42 rows=1 width=4)
   
注意這里顯示的數(shù)字, 甚至還有選擇的查詢策略都有可能在各個(gè) PostgreSQL版本之間不同--因?yàn)橐?guī)劃器在不斷改進(jìn)。
兼容性 SQL92  

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

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

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

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

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

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

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

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

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

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

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

CLOSE liahona;
COMMIT WORK;
兼容性 SQL92  

注意: 非嵌入式游標(biāo)的使用是 PostgreSQL 擴(kuò)展.游標(biāo)的語(yǔ)法和用途與定義與 里定義的嵌入式用法相似。
允許游標(biāo)在 FETCH 中的絕對(duì)定位, 并且允許將結(jié)果放在明確的變量里:
FETCH ABSOLUTE #
    FROM cursor
    INTO :variable [, ...]
    
ABSOLUTE
游標(biāo)將放置在寫(xiě)明的絕對(duì)的行數(shù)的位置上.在 PostgreSQL 中所有的行數(shù)都是相對(duì)數(shù)量,所以這一功能不支持.
:variable
目標(biāo)宿主變量.

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

GRANT
Name
GRANT  --  定義訪問(wèn)權(quán)限
Synopsis
GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] objectname [, ...]    TO { username | GROUP groupname | PUBLIC } [, ...]
描述
GRANT命令將某對(duì)象(表,視圖,序列) 上的特定權(quán)限給予一個(gè)用戶或者多個(gè)用戶或者一組用戶.這些權(quán)限將增加到那些已經(jīng)賦予的權(quán)限上,如果存在這些權(quán)限的話.
鍵字 PUBLIC 表示該權(quán)限要賦予所有用戶, 包括那些以后可能創(chuàng)建的用戶.PUBLIC 可以看做是一個(gè)隱含定義好的組,它總是包括所有用戶.請(qǐng)注意,任何特定的用戶都將擁有直接賦予他/她的權(quán)限,加上 他/她所處的任何組,以及再加上賦予 PUBLIC 的權(quán)限的總和.
在創(chuàng)建完對(duì)象之后,除了對(duì)象的創(chuàng)建者之外, 其它用戶沒(méi)有任何訪問(wèn)該對(duì)象的權(quán)限,除非創(chuàng)建者賦予某些權(quán)限.對(duì)對(duì)象的創(chuàng)建者而言,沒(méi)有什么權(quán)限需要賦予,因?yàn)閯?chuàng)建者自動(dòng)持有所有權(quán)限.(不過(guò),創(chuàng)建者出于安全考慮可以選擇廢棄一些他自己的權(quán)限.請(qǐng)注意賦予和廢止權(quán)限的能力是創(chuàng)建者與生具來(lái)的,并且不會(huì)丟失.刪除對(duì)象的權(quán)利也是創(chuàng)建者固有的,并且不能賦予或 撤銷.)
可能的權(quán)限有∶
SELECT
允許對(duì)聲明的表,試圖,或者序列 SELECT 仁義字段.還允許做 COPY 的源.
INSERT
允許向聲明的表 INSERT 一個(gè)新行. 同時(shí)還允許做 COPY 的目標(biāo).
UPDATE
允許對(duì)聲明的表中任意字段做 UPDATE . SELECT ... FOR UPDATE 也要求這個(gè)權(quán)限 (除了 SELECT 權(quán)限之外).比如, 這個(gè)權(quán)限允許使用nextval, currval 和 setval.
DELETE
允許從聲明的表中 DELETE 行.
RULE
允許在該表/視圖上創(chuàng)建規(guī)則.(參閱 CREATE RULE 語(yǔ)句.)
REFERENCES
要在一個(gè)表上創(chuàng)建一個(gè)外鍵約束,你必須在帶參考健字的表上 擁有這個(gè)權(quán)限.
TRIGGER
允許在聲明表上創(chuàng)建觸發(fā)器.(參閱 CREATE TRIGGER 語(yǔ)句.)
ALL PRIVILEGES
把上面所有權(quán)限都一次賦予.PRIVILEGES 關(guān)鍵字在 PostgreSQL 里是可選的, 但是嚴(yán)格的 SQL 要求有這個(gè)關(guān)鍵字.
其它命令要求的權(quán)限都在相應(yīng)的命令的參考頁(yè)上列出.
注意
我們要注意數(shù)據(jù)庫(kù) superusers 可以訪問(wèn)所有對(duì)象, 而不會(huì)受對(duì)象的權(quán)限設(shè)置影響.這個(gè)特點(diǎn)類似 Unix 系統(tǒng)的 root 的權(quán)限.和 root 一樣,除了必要的情況,總是以超級(jí)用戶 身分進(jìn)行操作是不明智的做法.
目前,要在 PostgreSQL 里只對(duì)某幾列 賦予權(quán)限,你必須創(chuàng)建一個(gè)擁有那幾行的視圖然后給那個(gè)視圖賦予權(quán)限.
使用 psql的 /z 命令 獲取在現(xiàn)有對(duì)象上的與權(quán)限有關(guān)的信息.
          Database    = lusitania
   +------------------+---------------------------------------------+
   | Relation        |        Grant/Revoke Permissions             |
   +------------------+---------------------------------------------+
   | mytable          | {"=rw","miriam=arwdRxt","group todos=rw"}   |
   +------------------+---------------------------------------------+
   Legend:
         uname=arwR -- privileges granted to a user
   group gname=arwR -- privileges granted to a group
              =arwR -- privileges granted to PUBLIC

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

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

INSERT
Name
INSERT  --  在表中創(chuàng)建新行
Synopsis
INSERT INTO table [ ( column [, ...] ) ]
    { DEFAULT VALUES | VALUES ( expression [, ...] ) | SELECT query }
輸入
table
現(xiàn)存表的名稱.
column
表 table 中的列/字段名.
DEFAULT VALUES
所有字段都會(huì)用NULL或者創(chuàng)建表時(shí)用DEFAULT子句聲明的值填充.
expression
賦予 column 的一個(gè)有效表達(dá)式或值.
query
一個(gè)有效的查詢.請(qǐng)參考 SELECT 語(yǔ)句獲取有效參數(shù)的進(jìn)一步描述.
輸出
INSERT oid 1
如果只插入了一行,返回此信息. oid OID 是被插入行的數(shù)字標(biāo)識(shí).
INSERT 0 #
如果插入了超過(guò)一行,返回此信息. # 是插入的行數(shù).
描述
INSERT允許我們向表中插入新行. 我們可以一次插入一行或多行作為查詢結(jié)果. 目標(biāo)列表中的列/字段可以按任何順序排列.
在目標(biāo)列中沒(méi)有出現(xiàn)的列/字段將插入缺省值, 要么是定義了的 DEFAULT 值或者 NULL。 如果向定義為 NOT NULL 的列中插入 NULL 值, PostgreSQL 將拒絕新列。
如果每行的表達(dá)式不是正確的數(shù)據(jù)類型,將試圖進(jìn)行自動(dòng)的類型轉(zhuǎn)換.
要想向表中插入數(shù)據(jù),你必須有插入權(quán)限, 同樣也要有選擇權(quán)限用于處理 WHERE 子句里聲明的任何表。
用法
向表 films 里插入一行:
INSERT INTO films VALUES
    ('UA502','Bananas',105,'1971-07-13','Comedy',INTERVAL '82 minute');   
在第二個(gè)例子里面省略了字段 len 因此在它里面將只存儲(chǔ)缺省的 NULL 值:
INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, DATE '1961-06-16', 'Drama');
   
向表 distributors 里插入一行;注意只聲明了字段 name ,而沒(méi)有聲明的字段 did 將被賦于它的缺省值:
INSERT INTO distributors (name) VALUES ('British Lion');
   
從表 tmp 中插入幾行到表 films 中:
INSERT INTO films SELECT * FROM tmp;
   
插入數(shù)組(請(qǐng)參考 PostgreSQL 用戶手冊(cè) 獲取關(guān)于數(shù)組的更多信息):
-- 創(chuàng)建一個(gè)空的 3x3 游戲板來(lái)玩圈-和-叉游戲
-- (所有這些查詢創(chuàng)建相同的板屬性)
INSERT INTO tictactoe (game, board[1:3][1:3])
    VALUES (1,'{{"","",""},{},{"",""}}');
INSERT INTO tictactoe (game, board[3][3])
    VALUES (2,'{}');
INSERT INTO tictactoe (game, board)
    VALUES (3,'{{,,},{,,},{,,}}');
   
兼容性 SQL92   
INSERT語(yǔ)句與 完全兼容. 可能碰到的關(guān)于 query 子句特性的限制在 SELECT語(yǔ)句中有相關(guān)文檔.
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 剑阁县| 卓资县| 托里县| 镇原县| 林西县| 中卫市| 巴东县| 崇阳县| 若羌县| 宽甸| 左贡县| 曲阳县| 鹤庆县| 枣阳市| 徐州市| 晋城| 黎平县| 兰考县| 河南省| 墨江| 莱西市| 南木林县| 石狮市| 紫云| 综艺| 福鼎市| 龙门县| 晋宁县| 正阳县| 深泽县| 洛宁县| 兰西县| 塔河县| 会宁县| 民乐县| 曲靖市| 五河县| 岑巩县| 略阳县| 灵璧县| 婺源县|