您的位置:首页 > 数据库 > Oracle

SQL(oracle)常用命令

2008-03-02 18:46 375 查看
这部分包含那些PostgreSQL支持的SQL命令的信息.这里的"SQL"就是该语言通常的含义;每条命令的与标准有关的兼容性的信息可以在相关的参考页中找到.
TableofContents
ABORT--退出当前事务
ALTERGROUP--向组中增加用户或从组中删除用户
ALTERUSER--改变数据库用户帐号.
ANALYZE--收集与数据库有关的统计
BEGIN--开始一个事务块
CHECKPOINT--强制一个事务日志检查点
CLOSE--关闭一个游标
CLUSTER--根据一个索引对某个表集簇
COMMENT--定义或者改变一个对象的评注
COMMIT--提交当前事务
COPY--在表和文件之间拷贝数据
CREATEAGGREGATE--定义一个新的聚集函数
CREATECONSTRAINTTRIGGER--定义一个新的约束触发器
CREATEDATABASE--创建新数据库
CREATEFUNCTION--定义一个新函数
CREATEGROUP--定义一个新的用户组
CREATEINDEX--定义一个新索引
CREATELANGUAGE--定义一种新的过程语言
CREATEOPERATOR--定义一个新的操作符
CREATERULE--定义一个新的重写规则
CREATESEQUENCE--创建一个新的序列发生器
CREATETABLE--定义一个新表
CREATETABLEAS--从一条查询的结果中创建一个新表
CREATETRIGGER--定义一个新的触发器
CREATETYPE--定义一个新的数据类型
CREATEUSER--创建一个新的数据库用户帐户
CREATEVIEW--定义一个视图
DECLARE--定义一个游标
DELETE--删除一个表中的行
DROPAGGREGATE--删除一个用户定义的聚集函数
DROPDATABASE--删除一个数据库.
DROPFUNCTION--删除一个用户定义的函数
DROPGROUP--删除一个用户组
DROPINDEX--删除一个索引
DROPLANGUAGE--删除一个用户定义的过程语言
DROPOPERATOR--删除一个用户定义操作符
DROPRULE--删除一个重写规则
DROPSEQUENCE--删除一个序列
DROPTABLE--删除一个表
DROPTRIGGER--删除一个触发器定义.
DROPTYPE--删除一个用户定义数据类型
DROPUSER--删除一个数据库用户帐号
DROPVIEW--删除一个视图
END--提交当前的事务
EXPLAIN--显示语句执行规划
FETCH--用游标从表中抓取行
GRANT--定义访问权限
INSERT--在表中创建新行
LISTEN--监听一个通知
LOAD--装载或重载一个共享库文件
LOCK--明确地锁定一个表
MOVE--把游标放到表中的特定的行
NOTIFY--生成一个通知
REINDEX--恢复一个损坏了的索引
RESET--把一个运行时参数值恢复为缺省值
REVOKE--删除访问权限.
ROLLBACK--退出当前事务
SELECT--从表或视图中取出若干行.
SELECTINTO--从一个查询的结果中创建一个新表
SET--改变运行时参数
SETCONSTRAINTS--设置当前事务的约束模式
SETSESSIONAUTHORIZATION--为当前会话设置会话用户标识符和当前用户标识符
SETTRANSACTION--设置当前事务的特性
SHOW--显示运行时参数的数值
TRUNCATE--清空一个表
UNLISTEN--停止监听通知信息
UPDATE--更新一个表中的行
VACUUM--垃圾收集以及可选地分析一个数据库

ABORT退出当前事务
ABORT[b]Name[/b]
ABORT--退出当前事务
Synopsis
ABORT[WORK|TRANSACTION]
输入

输出
ROLLBACK成功的返回信息.
NOTICE:ROLLBACK:notransactioninprogress
如果当前没有任何正在处理的事务存在.
描述
ABORT回卷当前事务并且废弃所有当前事务中做的更新.这个命令和命令ROLLBACK完全一样,只是由于历史原因而保留下来.
注意
COMMIT语句可以成功地结束/提交一个事务.
用法
取消所有更改:
ABORTWORK;
兼容性SQL92
此命令是PostgreSQL基于历史原因做的扩展.ROLLBACK是中等价的命令.

ALTERGROUP向组中增加用户或从组中删除用户
ALTERGROUP
Name
ALTERGROUP--向组中增加用户或从组中删除用户
Synopsis
ALTERGROUPnameADDUSERusername[,...]
ALTERGROUPnameDROPUSERusername[,...]
输入
Name
要更改的组名称。
Username
准备向组中增加或从组中删除的用户名。用户名必须已经存在。
输出
ALTERGROUP
更改成功的返回信息。
描述
ALTERGROUP用于向组中增加用户或者从组中删除用户。只有数据库超级用户才能使用这条命令。向组中增加用户并不创建用户。同样从组中删除用户也不删除用户本身。
使用CREATEGROUP创建新组以及DROPGROUP删除一个组。
用法
向组中增加用户:
ALTERGROUPstaffADDUSERKarl,john;
从组中删除用户:
ALTERGROUPworkersDROPUSERBeth;
兼容性SQL92
里没有ALTERGROUP语句。角色(roles)的概念与之类似。

ALTERTABLE修改表的定义
ALTERTABLE
Name
ALTERTABLE--修改表的定义
Synopsis
ALTERTABLE[ONLY]table[*]
ADD[COLUMN]columntype[columnconstraint[...]]

ALTERTABLE[ONLY]table[*]
ALTER[COLUMN]column{SETDEFAULTvalue|DROPDEFAULT}
ALTERTABLE[ONLY]table[*]
ALTER[COLUMN]columnSETSTATISTICSinteger
ALTERTABLE[ONLY]table[*]
RENAME[COLUMN]columnTOnewcolumn
ALTERTABLE
RENAMETOnewtable
ALTERTABLE
ADDtableconstraintdefinition
ALTERTABLE[ONLY]table
DROPCONSTRAINTconstraint
{RESTRICT|CASCADE}
ALTERTABLEtable
OWNERTOnewowner

输入
table
试图更改的现存表的名称.
column
现存或新的列名称.
type
新列的类型.
newcolumn
现存列的新名称.
newtable
表的新名称.
tableconstraintdefinition
表的新的约束定义.
Newuser
该表的新所有者的用户名.
输出
ALTER
从被改名的列或表返回的信息.
ERROR
如果一个列或表不存在返回的信息.
描述
ALTERTABLE变更一个现存表的定义.
ADDCOLUMN形式使用与CREATETABLE一样的语法向表中增加一个新列/字段。
ALTERCOLUMNSET/DROPDEFAULT形式允许你从列/字段中设置或者删除缺省(值)。注意缺省(值)只适用于随后的INSERT命令。它们不会改变已经存在于表中的行.
ALTERCOLUMNSETSTATISTICS形式允许你为随后的ANALYZE操作设置收集统计信息的对象.
RENAME子句可以在不影响任何相关数据的情况下更改一个表,字段,索引或者序列名称。因此,在此命令执行后数据仍将是相同尺寸和类型。
ADDtableconstraintdefinition子句使用与CREATETABLE一样的语法向表中增加一个新的约束。
DROPCONSTRAINTconstraint子句删除所有表上匹配constraint的CHECK约束(以及其子表)
OWNER把该表的所有者改为用户newuser.
如果要改变表的纲要,你必须是表的所有者.
注意
COLUMN关键字是多余的,可以省略.
在目前的ADDCOLUMN实现里还不支持新列/字段的缺省(值)和NOTNULL子句。不过你可以随后用ALTERTABLE的SETDEFAULT形式设置缺省(值)。(你可能还想用UPDATE把已存在行更新为缺省值。)
目前只有CHECK约束可以从表中删除.RESTRICT关键字是必须的,尽管并不检查依赖性.还不支持CASCADE选项.要删除一个PRIMARY或者UNIQUE约束,用DROPINDEX命令删除相关的索引.要删除FOREIGNKEY约束,你需要重新创建并重新装载该表,创建的时候使用CREATETABLE命令的其它参数.
比如,要删除在表distributors上的所有约束∶
CREATETABLEtempASSELECT*FROMdistributors;
DROPTABLEdistributors;
CREATETABLEdistributorsASSELECT*FROMtemp;
DROPTABLEtemp;

要修改表的结构,你必须是表的所有人。不允许更改系统表结构的任何部分。PostgreSQL用户手册里有关于继承的更多信息.
请参考CREATETABLE部分获取更多有效参数的描述.
用法
向表中增加一个varchar列:
ALTERTABLEdistributorsADDCOLUMNaddressVARCHAR(30);
对现存列改名:
ALTERTABLEdistributorsRENAMECOLUMNaddressTOcity;
更改现存表的名字∶
ALTERTABLEdistributorsRENAMETOsuppliers;
给一个表增加一个检查约束∶
ALTERTABLEdistributorsADDCONSTRAINTzipchkCHECK(char_length(zipcode)=5);
删除一个表和它的所有子表的监查约束∶
ALTERTABLEdistributorsDROPCONSTRAINTzipchk;
向表中增加一个外键约束:
ALTERTABLEdistributorsADDCONSTRAINTdistfkFOREIGNKEY(address)REFERENCESaddresses(address)MATCHFULL;
给表增加一个(多字段)唯一约束∶
ALTERTABLEdistributorsADDCONSTRAINTdist_id_zipcode_keyUNIQUE(dist_id,zipcode);
兼容性SQL92
ADDCOLUMN形式是兼容的,除了上面说的缺省(值)和NOTNULL约束外。ALTERCOLUMN形式是完全兼容的。
ALTERTABLE声明了一些附加的PostgreSQL目前还不直接支持的功能:
ALTERTABLEtableDROP[COLUMN]column{RESTRICT|CASCADE}

从一个表中删除一个列.目前,要删除一个现存的列,表必须重新创建和重新装载:
CREATETABLEtempASSELECTdid,cityFROMdistributors;
DROPTABLEdistributors;
CREATETABLEdistributors(
didDECIMAL(3)DEFAULT1,
nameVARCHAR(40)NOTNULL
);
INSERTINTOdistributorsSELECT*FROMtemp;
DROPTABLEtemp;

重命名表,列/字段,索引,和序列的名字是PostgreSQL对的扩展。

ALTERUSER
ALTERUSER
Name
ALTERUSER--改变数据库用户帐号.
Synopsis
ALTERUSERusername[[WITH]option[...]]
这里option可以是∶
[ENCRYPTED|UNENCRYPTED]PASSWORD'password'
|CREATEDB|NOCREATEDB
|CREATEUSER|NOCREATEUSER
|VALIDUNTIL'abstime'
输入
username
想进行更改的用户的名字。
[encrypted|unencrypted]password
此帐号所使用的新口令。Encrypted/unencrypted控制该口令在数据库里是否以加密形式存储.
CREATEDB
NOCREATEDB
这个子句定义该用户创建数据库的能力。如果声明了CREATEDB,该用户可以创建她自己的数据库。用NOCREATEDB将剥夺一个用户创建数据库的能力。
CREATEUSER
NOCREATEUSER
这个子句决定一个用户能否创建新用户。这个选项同样还令该用户成为超级用户,可以超越所有访问限制。
abstime
该用户帐号口令的有效日期(和可选的时间)。
输出
ALTERUSER
更改成功的返回信息.
ERROR:ALTERUSER:user"username"doesnotexist
如果数据库不认识你所声明的用户返回的信息.
描述
ALTERUSER用于更改用户的PostgreSQL帐号的属性.没有在该命令中出现的属性保持原值.
只有一个数据库超级用户可以用这个命令更改权限和口令有效期。普通用户只能更改他们自己的口令。
ALTERUSER无法改变一个用户的组的成员性.用ALTERGROUP实现这个目地.
使用CREATEUSER创建新用户和DROPUSER删除用户。
用法
更改一用户口令:
ALTERUSERdivideWITHPASSWORD'hu8jmn3';
更改一用户有效期
ALTERUSERManuelVALIDUNTIL'Jan312030';
更改一用户有效期,声明其权限应该在用比UTC早一小时的时区记时的1998年5月4日正午失效
ALTERUSERChrisVALIDUNTIL'May412:00:001998+1';
赋予一用户创建新用户和新数据库的权限:
ALTERUSERMiriamCREATEUSERCREATEDB;
兼容性SQL92
里没有ALTERUSER.该标准将用户定义部分交给具体数据库实现处理.

ANALYZE
ANALYZE
Name
ANALYZE--收集与数据库有关的统计
Synopsis
ANALYZE[VERBOSE][table[(column[,...])]]
输入
VERBOSE
打开处理过程信息的显示.
table
要分析的特定表的名字.缺省是所有表.
column
要分析的特定行的名字.缺省是所有列.
输出
ANALYZE
命令已经结束了.
描述
ANALYZE收集有关PostgreSQL表的内容的统计,然后把结果保存在系统表pg_statistic里.随后,查询规划器就可以使用这些统计帮助判断查询的最有效的规划.
如果没有参数,ANALYZE检查在当前数据库里的所有表.如果有参数,ANALYZE只检查那个表.你还可以给出一列字段名字,这个时候只有那些字段的统计信息被更新.
注意
周期性地运行ANALYZE,或者在对表的大部分内容做了更改之后马上运行它是个好习惯,准确的统计信息将帮助规划器选择最合适的查询规划,并因此而改善查询处理的速度.一种比较经常采用的策略是每天在低负荷的时候运行一次VACUUM和ANALYZE
VACUUMFULL不同的是,ANALYZE只需要在目标表上有一个读取锁,因此它可以和表上的其它活动并行地运行.
对于大表,ANALYZE采集表内容的一个随机的抽样做统计,而不是检查每一行.这样即使是很大的表,我们也只需要很少的一些时间就可以完成分析.不过要注意的是统计只是近似的结果,而且每次运行ANALYZE都会有一些小变化,即使表内容实际上没有改变也这样.这样会导致EXPLAIN所显示的规划器计算的开销有一些小变化,
收集的统计信息通常包括一个每字段最常用数值的列表以及一个包线图,显示每个字段里数据的近似分布.如果ANALYZE认为它们都没有什么用,(比如,在一个唯一键字的字段上没有公共的数值)或者是该字段数据类型不支持相关的操作符,那么它们都可以忽略.在用户手册中有关于统计的更多信息.
分析的广度可以通过用ALTERTABLEALTERCOLUMNSETSTATISTICS(参阅ALTERTABLE调整每字段的统计目标来控制.目标数值设置最常用数值列表中的记录的最大数目以及包线图中的最大块数.缺省的目标数值是10,不过我们可以调节这个数值获取规划器计算精度和ANALYZE运行所需要的时间以及pg_statistic里面占据的空间数目之间的平衡.特别是,把统计目标设置为零就关闭了该字段的统计收集.对那些从来不参与到查询的WHERE,GROUPBY,或者ORDERBY子句里的字段是很有用的,因为规划器不会使用到这样的字段上的统计.)
在被分析的字段中最大的统计目标决定为统计采样的表中的行的数目.增大目标会导致做ANALYZE的时候成比例地增大对时间和空间的需求.
兼容性SQL92
里没有ANALYZE语句.

BEGIN
BEGIN
Name
BEGIN--开始一个事务块
Synopsis
BEGIN[WORK|TRANSACTION]
输入
WORK
TRANSACTION
可选关键字。没什么作用。
输出
BEGIN
这表明一个新的事务已经开始.
NOTICE:BEGIN:alreadyatransactioninprogress
这表明该事务已经运行,当前事务不受影响.
描述
缺省时,PostgreSQL以非链接模式(unchainedmode)(在其他数据库系统里也称之为"自动提交("autocommit"))"。换句话说,每个用户语句都是在其自身的事务中运行并且在语句结束时隐含的调用一个提交(commit)(如果执行成功则提交,否则调用一个回卷)。BEGIN以链接模式(chainedmode)初始化一个用户事务,也就是说所有BEGIN命令后的用户语句都将在一个事务里面执行直到一个明确的COMMIT,ROLLBACK,或执行退出(abort)。在链接模式里执行的语句很明显地快得多,因为事务开始/提交(start/commit)需要大量的CPU和磁盘活动。在一个事务内部执行多条语句时因为可能修改若干个相关的表因而同样需要一致性。
在PostgreSQL里缺省的事务隔离级别是READCOMMITTED,这时在事务内部的查询只看到查询提交之前的(数据)修改。所以,如果你需要更严格的事务隔离,你必须在BEGIN后马上使用SETTRANSACTIONISOLATIONLEVELSERIALIZABLE。在SERIALIZABLE模式里,查询将只能看到整个事务开始之前的修改。(实际上是在一个可串行化事务内部第一个DML语句执行前的数据)。
如果提交了事务,PostgreSQL将保证要么实现所有更新,要么所有更新都没有实现。事务有标准的ACID(原子性,一致性,隔离性,持续性)(atomic,consistent,isolatable,anddurable)属性。
注意
请参考LOCK语句获取关于在事务内部锁定一个表的详细信息.
使用COMMIT或者ROLLBACK结束一个事务.
用法
开始一个用户事务:
BEGINWORK;
兼容性SQL92
BEGIN是PostgreSQL语言的扩展.在中没有明确的BEGIN的定义;事务初始化总是隐含的而且使用一个COMMIT或者ROLLBACK语句终止.
注意:许多关系型数据库为了方便提供一个自动提交(autocommit)特性。
顺便说一句,BEGIN关键字在嵌入SQL里用于不同的目的。我们建议你在移植数据库应用时仔细检查事务的语意。
还要求事务的缺省隔离级别是SERIALIZABLE。
CHECKPOINT
CHECKPOINT
Name
CHECKPOINT--强制一个事务日志检查点
Synopsis
CHECKPOINT
描述
预写式日志(Write-AheadLogging(WAL))缺省时在事务日志中每隔一段时间放一个检查点.(要调整这个原子化的检查点间隔,你可以参考运行时选项CHECKPOINT_SEGMENTS和CHECKPOINT_TIMEOUT.)CHECKPOINT强迫在命令声明时立即进行检查,而不是等到下一次调度时的检查点.
检查点是一个事务日志训练中的点,在该点,所有数据文件都被更新以反映日志中的信息.所有数据文件都将被冲刷到磁盘.请参考PostgreSQL管理员手册获取更多有关WAL系统的信息.
只有超级用户可以调用CHECKPOINT.该命令不是设计用于正常操作过程中的.
又见
PostgreSQL管理员手册
兼容性SQL92
CHECKPOINT命令是PostgreSQL语言的扩展.

CLOSE
CLOSE
Name
CLOSE--关闭一个游标
Synopsis
CLOSEcursor
输入
cursor一个待关闭的游标的名字.
输出
CLOSE游标关闭成功返回的信息.
NOTICEPerformPortalClose:portal"cursor"notfound
如果该cursor没有声明或已经关闭,返回该信息.
描述
CLOSE释放和一个游标关联的资源.一个游标关闭后,不允许对其再做任何操作.一个不再使用的游标应该关闭掉.
如果用COMMITROLLBACK提交了一个事务,将对每个打开的游标执行隐含的关闭操作.
注意
PostgreSQL没有明确的OPEN(打开)游标的语句;我们认为一个游标在声明时就打开了.使用DECLARE语句声明一个游标.
用法
关闭游标liahona:
CLOSEliahona;
兼容性SQL92
CLOSE与完全兼容.

CLUSTER
Name
CLUSTER--根据一个索引对某个表集簇
Synopsis
CLUSTERindexnameONtablename

输入
indexname
一个索引名称.
table
准备建簇的表的名称.
输出
CLUSTER
成功建簇.
ERROR:relation<tablerelation_number>inherits"table"
ERROR:Relationtabledoesnotexist!
描述
CLUSTER指示PostgreSQL近似地基于索引indexname的度量对表table进行存储建簇.索引必须已经在表tablename.上定义了.
当对一个表建簇后,该表的物理存储将基于索引信息进行.建簇是静态的,也就是说,当表被更新后,改变的内容不会建簇.不会试图对更新过的记录重新建簇.如果需要,可以通过手工执行该命令的方法重建簇.
注意
该表实际上按索引顺序拷贝到了一个临时表中,然后重新改成原名.因此,在建簇时所有赋予的权限和其它索引都将丢失.
如果你只是随机的访问表中的行,那么在堆表中的数据的实际存储顺序是无关紧要的.但是,如果你对某些数据的访问多于其他数据,而且有一个索引将这些数据分组,那你就将从使用CLUSTER中获益.
另一个CLUSTER很有帮助的例子是当你用索引从一个表中取出几个记录时.如果你从一个表中请求一定索引范围的值,或者是一个索引过的值对应多行,CLUSTER也会有助于应用,因为如果索引标识出第一匹配行所在的堆存储页,所有其他行也可能已经在同一堆存储页里了,这样便节省了磁盘访问的时间,加速了查询.
有两种建簇的数据.第一种是用CLUSTER命令,此命令将原表按你声明的索引重新排列.这个动作在操作大表时可能会很慢,因为每一行都从堆存储页里按索引顺序取出,如果存储页表没有排序,整个表是随机存放在各个页面的,因而每行都要进行依次磁盘页面操作.PostgreSQL有一个缓冲,但一个大表的主体是不可能都放到缓冲去的.
另一个对数据建簇的方法是使用
SELECTcolumnlistINTOTABLEnewtable
FROMtableORDERBYcolumnlist

这个用法使用PostgreSQL排序的代码ORDERBY来匹配索引,在对未排序的数据操作时速度快得多.然后你可以删除旧表,用ALTERTABLE...RENAME将newtable改成旧表名,并且重建该表所有索引.唯一的问题是OID将不保留.这时再做CLUSTER将快得多,因为大多数堆栈数据已经排过序了而且使用现有的索引.
用法
以雇员的薪水属性对雇员关系建簇.
CLUSTERemp_indONemp;
兼容性SQL92
在规范里没有CLUSTER语句.

COMMENT
COMMENT
Name
COMMENT--定义或者改变一个对象的评注
Synopsis
COMMENTON
[
[DATABASE|INDEX|RULE|SEQUENCE|TABLE|TYPE|VIEW]object_name|
COLUMNtable_name.column_name|
AGGREGATEagg_nameagg_type|
FUNCTIONfunc_name(arg1,arg2,...)|
OPERATORop(leftoperand_typerightoperand_type)|
TRIGGERtrigger_nameONtable_name
]IS'text'
输入
object_name,table_name,column_name,agg_name,func_name,op,trigger_name
要加入评注的对象名称.
text
要加入的评注.
输出
COMMENT成功对表评注后的返回.
描述
COMMENT存储一个数据库对象的评注,这个评注可以很容易用psql\dd\d+或者\l+命令检索出来.其它检索评注的用户接口可以建设在psql所用地同样地内部函数的基础上,也就是obj_description()和col_description().
要修改一个评注,为同一个对象发出一条新的COMMENT命令即可.每个对象只存储一条评注.要删除评注,在文本字串的位置写上NULL.当删除对象时,评注自动被删除掉.
需要说明的是目前评注没有安全机制∶任何联接到某数据库上地用户都可以看到所有该数据库对象地评注(尽管只有超级用户可以修改不属于它地对象的评注).因此,不要在评注里放安全性敏感地信息.
用法
给表mytable加评注:
COMMENTONmytableIS'Thisismytable.';
一些例子:
COMMENTONDATABASEmy_databaseIS'DevelopmentDatabase';
COMMENTONINDEXmy_indexIS'Enforcesuniquenessonemployeeid';
COMMENTONRULEmy_ruleIS'LogsUPDATESofemployeerecords';
COMMENTONSEQUENCEmy_sequenceIS'Usedtogenerateprimarykeys';
COMMENTONTABLEmy_tableIS'EmployeeInformation';
COMMENTONTYPEmy_typeIS'ComplexNumbersupport';
COMMENTONVIEWmy_viewIS'Viewofdepartmentalcosts';
COMMENTONCOLUMNmy_table.my_fieldIS'EmployeeIDnumber';
COMMENTONAGGREGATEmy_aggregate(doubleprecision)IS'Computessamplevariance';
COMMENTONFUNCTIONmy_function(timestamp)IS'ReturnsRomanNumeral';
COMMENTONOPERATOR^(text,text)IS'Performsintersectionoftwotext';
COMMENTONTRIGGERmy_triggerONmy_tableIS'UsedforR.I.';
兼容性SQL92
里没有COMMENT

COMMIT
COMMIT
Name
COMMIT--提交当前事务
Synopsis
COMMIT[WORK|TRANSACTION]
输入
WORK
TRANSACTION
可选关键字。没有作用。
输出
COMMIT
提交成功返回此信息.
NOTICE:COMMIT:notransactioninprogress
如果过程中没有事务,返回此信息.
描述
COMMIT提交当前事务.所有事务的更改都将为其他事务可见,而且保证当崩溃发生时的可持续性.
注意
关键字WORK和TRANSACTION都可以忽略.
使用ROLLBACK语句退出一次事务.
用途
要让所有变更永久化:
COMMITWORK;
兼容性SQL92
只声明了两种形式COMMIT和COMMITWORK。否则完全兼容。

COPY
COPY
Name
COPY--在表和文件之间拷贝数据
Synopsis
COPY[BINARY]table[WITHOIDS]
FROM{'filename'|stdin}
[[USING]DELIMITERS'delimiter']
[WITHNULLAS'nullstring']
COPY[BINARY]table[WITHOIDS]
TO{'filename'|stdout}
[[USING]DELIMITERS'delimiter']
[WITHNULLAS'nullstring']

输入
BINARY
改变字段格式行为,强制所有数据都使用二进制格式存储和读取,而不是以文本的方式.DELIMITERS和WITHNULL选项和二进制格式无关.
table
现存表的名字.
WITHOIDS
拷贝每行的内部唯一对象标识(OID).
filename
输入或输出的Unix文件的绝对文件名.
stdin
声明输入是来自客户端应用.
stdout
声明输入前往客户端应用.
delimiter
用于在文件中每行中分隔各个字段的字符.
nullstring
个代表NULL值的字串。缺省是"\N"(反斜杠-N)。当然,你可以自己挑一个空字串。
注意:对于拷贝入(copyin),任何匹配这个字串的字串将被存储为NULL值,所以你应该确保你用的字串和拷贝出(copyout)相同。
输出
COPY
拷贝成功完成.
ERROR:reason
拷贝失败,原因在错误信息里.
描述
COPY在PostgreSQL表和标准文件系统文件之间交换数据.COPYTO把一个表的所有内容都拷贝到一个文件,而COPYFROM从一个文件里拷贝数据到一个表里(把数据附加到表中已经存在的内容里).
COPY指示PostgreSQL后端直接从文件中读写数据.如果声明了文件名,那么该文件必须为后端可见,而且文件名必须从后端的角度声明.如果声明的是stdin或stdout,数据通过客户前端流到后端.
小提示:不要把COPY和psql指令\copy混淆在一起.\copy调用COPYFROMstdinCOPYTOstdout,然后抓取/存储psql客户端可以访问的一个文件里.因此,使用\copy的时候,可访问性和访问权限取决于客户端而不是服务器端.
注意
BINARY关键字将强制使用二进制对象而不是文本存储/读取所有数据.这样做在一定程度上比传统的拷贝命令快,但二进制拷贝文件在不同机器体系间的植性不是很好.
缺省地,文本拷贝使用tab("\t")字符作为分隔符.分隔符仍然可以用关键字USINGDELIMITERS改成任何其它的字符.在数据中碰巧与分隔符相同的字符将用反斜扛引起.
你对任何要COPY出来的数据必须有select权限,对任何要COPY入数据的表必须有insert或update权限.使用COPY时后端同样需要适当的对文件操作的Unix权限.
COPYTO不会激活规则,也不会处理字段缺省值。不过它的确激活触发器和检查约束。
COPY在第一个错误处停下来.这些在COPYFROM中不应该导致问题,但在COPYTO时目的表会已经接收到早先的行,这些行将不可见或不可访问,但是仍然会占据磁盘空间.如果你碰巧是拷贝很大一块数据文件的话,积累起来,这些东西可能会占据相当大的一部分磁盘空间.你可以调用VACUUM来恢复那些磁盘空间.
COPY命令里面的文件必须是可以由后端直接读或写的文件,而不是由客户端应用读写.因此,它们必须位于数据库服务器上或者可以为数据库服务器所访问,而不是由客户端做这些事情.它们必须是PostgreSQL用户(服务器运行的用户ID)可以访问到并且可读或者可写,而不是客户端.COPY到一个命名文件是只允许数据库超级用户进行的,因为它允许写任意后端有权限写的文件.
小技巧:psql指令\copy以客户的权限读或写在客户端的文件,因此不局限于超级用户.
我们建议在COPY里的文件名字总是使用绝对路径.在COPYTO的时候是由后端强制进行的,但是对于COPYFROM,你的确有从一个声明为相对路径的文件里读取的选择.该路径将解释为相对于后端的工作目录(在$PGDATA里的什么地方),而不是客户端的工作目录.
文件格式
文本格式
当不带BINARY选项使用COPYTO时,生成的文件每条元组占据一行,每列(字段)用分隔符分开.内嵌的分隔符字符将由一个反斜杠("\")开头.字段值本身是由与每个字段类型相关的输出函数生成的字符串.某一类型的输出函数本身不应该生成反斜杠;这个任务由COPY本身完成.
每个元组的实际格式是
<attr1><separator><attr2><separator>...<separator><attrn><newline>

请注意每行的结尾是用Unix风格的换行符("\n")标记的.如果给出的文件包含DOS或Mac风格的换行符,那么COPYFROM将会出错.
如果声明了WITHOIDST,它将被放在每行的开头.
如果COPYTO将它的输出输出到标准输出而不是一个文件,在拷贝结束时,它将在一个新行上输出一个反斜杠("\")和一个句点("."),最后是一个换行符做为文件结束符.类似,如果COPYFROM从标准输入读入数据,它将把一行开头的由一个反斜杠("\")和一个句点(".")和一个换行符组成的这三个连续字符作为文件结束符.不过,如果在这个特殊的文件结束模式出现前关闭了输入联接,那么COPYFROM将正确结束(接着就是后端自身).
反斜杠有其他的含义.一个文本反斜杠字符输出成两个连续的反斜杠("\\")一个文本tab字符用一个反斜杠后面跟一个tab代表.(如果你使用了非tab作为列分隔符,那么在数据中出现的该字符将会使用反斜扛转意.)一个文本新行字符用一个反斜杠和一个新行代表.当装载不是由PostgreSQL生成的文件时,你需要将反斜杠字符("\")转换成双反斜杠("\\")以保证正确装载.
二进制格式
在PostgreSQLv7.1中的COPYBINARY的文件格式做了变化.新格式由一个文件头,零或多条元组,以及文件尾组成.
文件头
文件头由24个字节的固定域组成,后面跟着一个变长的头扩展区.固定域是:
签名
12-字节的序列"PGBCOPY\n\377\r\n\0"---请注意空是签名是要求的一部分.(使用这个签名是为了让我们能够很容易看出文件是否已经被一个非8位安全的转换器给糟蹋了.这个签名会被换行符转换过滤器,删除空,删除高位,或者奇偶的改变而改变.)
整数布局域
以源机器的字节序的int32常量0x1020304.如果在这里侦测到错误的字节序,那么读者很可能在后面的字段列造成了字节错位.
标志域
int32位掩码表示该文件格式的重要方面.位是从0(LSB)到31(MSB)编码的---请注意这个域是以源机器的位权重存储的,后继的整数都是如此.位16-31是保留用做关键文件格式的;如果读者发现一个不认识的位出现在这个范围内,那么它应该退出.位0-15都保留为标志向后兼容的格式使用;读者可以忽略这个范围内的不认识的位.目前只定义了一个标志位,而其它的必须是零:
Bit16
如果为1,那么在倾倒中包括了OID;如果为0,则没有
头扩展范围长度
int32以字节计的头剩余长度,不包括自身.在初始的版本里,它将会是零,后面紧跟第一条元组.对该格式的更多的修改都将允许额外的数据出现在头中.读者应该忽略任何它不知道该如何处理的头扩展数据.
头扩展数据是一个用来保留一个自定义的数据训练用的.这个标志域无意告诉读者扩展区的内容是什么.头扩展的具体设计内容留给以后的版本用.
这样设计就允许向下兼容头附加(增加头扩展块,或者设置低位序标志位)以及非向下兼容修改(设置高位标志位以标识这样的修改,并且根据需要向扩展区域增加支持数据).
元组
每条元组都以一个int16计数开头,该计数是元组中字段的数目.(目前,在一个表里的每条元组都有相同的计数,但可能不会永远这样.)然后后面不断出现元组中的各个字段,在字段数据后面可能跟着一个int16类型长度字.类型长度域是这样解释的:

数据域是NULL.没有数据跟着.
>0
数据域是定长数据类型.和类型长字相同的准确的N字节.
-1
数据域是变长的数据类型.下面四个字节是变长头,它包含包括其自身在内的所有值长度.
<-1
保留为将来使用.
对于非NULL域,读者可以检查这个类型长度是否匹配目标列的长度.这样就提供了一种简单但有用的检查,核实该数据是否预期数据.
在数据域之间没有对奇填充或者任何其它额外的数据.还要注意该格式并不区分一种数据类型是传值还是传参.这些东西都是非常有意的:它们可能可以提高这些文件的移植性(尽管位权重和浮点格式等问题可能仍然不能让你进行跨机器移动二进制数据).
如果在倾倒中包括了OID,那么该OID域立即跟在域计数字后面.它是一个普通的域,只不过它没有包括在域计数.但它包括类型长度---这样就允许我们不用花太多的劲就可以处理4字节和8字节,并且如果某个家伙允许OID是可选的话,那么还可以把OID显示成NULL.
文件尾
文件尾包括一个int16字减1.这样就很容易与一条元组的域计数字相区分.
如果一个域计数字既不是-1也不是预期的字段的数目,那么读者应该报错.这样就提供了对丢失与数据的同步的额外的检查.
用法
下面的例子把一个表拷贝到标准输出,使用竖直条(|)作为域分隔符:
COPYcountryTOstdoutUSINGDELIMITERS'|';

从一个Unix文件中拷贝数据到一个表范围中:
COPYcountryFROM'/usr1/proj/bray/sql/country_data';

下面是一个可以从stdin中拷贝数据到表中的例子(因此它在最后一行中有终止序列):
AFAFGHANISTAN
ALALBANIA
DZALGERIA
ZMZAMBIA
ZWZIMBABWE
\.

请注意在这里每行里的空白实际上是一个TAB.
下面的是同样的数据,在一台Linux/i586机器上以二进制形式输出.这些数据是用Unix工具od-c过滤之后输出的.该表有三个域;第一个是char(2),第二个是text,第三个是integer.所有的行在第三个域都是一个null值.
0000000PGBCOPY\n377\r\n\0004003002001
0000020\0\0\0\0\0\0\0\0003\0377377006\0\0\0
0000040AF377377017\0\0\0AFGHANIS
0000060TAN\0\0003\0377377006\0\0\0AL377
0000100377\v\0\0\0ALBANIA\0\0003\0
0000120377377006\0\0\0DZ377377\v\0\0\0AL
0000140GERIA\0\0003\0377377006\0\0\0Z
0000160M377377\n\0\0\0ZAMBIA\0\0003
0000200\0377377006\0\0\0ZW377377\f\0\0\0Z
0000220IMBABWE\0\0377377

兼容性SQL92在里没有COPY语句.

CREATEAGGREGATE
CREATEAGGREGATE
Name
CREATEAGGREGATE--定义一个新的聚集函数
Synopsis
CREATEAGGREGATEname(BASETYPE=input_data_type,
SFUNC=sfunc,STYPE=state_type
[,FINALFUNC=ffunc]
[,INITCOND=initial_condition])

输入
name
要创建的聚集函数名.
input_data_type
本聚集函数要处理的基本数据类型.对于不检查输入类型的聚集来说,这个参数可以声明为ANY.(比如count(*)).
sfunc
用于处理源数据列里的每一个输入数据的状态转换函数名称.它通常是一个两个参数的函数,第一个参数的类型是state_type而第二个参数的类型是input_data_type.另外,对于一个不检查输入数据的聚集,该函数只接受一个类型为state_type的参数.不管是哪种情况,此函数必须返回一个类型为state_type的值.这个函数接受当前状态值和当前输入数据条目,而返回下个状态值.
state_type
聚集的状态值的数据类型.
ffunc
在转换完所有输入域/字段后调用的最终处理函数.它计算聚集的结果.此函数必须接受一个类型为state_type的参数.聚集的输出数据类型被定义为此函数的返回类型.如果没有声明ffunc则使用聚集结果的状态值作为聚集的结果,而输出类型为state_type.
initial_condition
状态值的初始设置(值).它必须是一个数据类型state_type可以接受的文本常量值.如果没有声明,状态值初始为NULL.
输出
CREATE
命令执行成功的返回信息.
描述
CREATEAGGREGATE允许用户或程序员通过定义新的聚集函数来扩展PostgreSQL的功能.一些用于基本类型的聚集函数如min(integer)和avg(doubleprecision)等已经包含在基础软件包里了.如果你需要定义一个新类型或需要一个还没有提供的聚集函数,这时便可用CREATEAGGREGATE来提供我们所需要的特性.
一个聚集函数是用它的名字和输入数据类型来标识的.如果两个聚集的输入数据不同,它们可以有相同的名字.要避免冲突,不要写一个与聚集同名而且输入函数也相同的普通函数.
一个聚集函数是用一个或两个普通函数做成的:一个状态转换函数sfunc,和一个可选的终计算函数ffunc.它们是这样使用的:
sfunc(internal-state,next-data-item)--->next-internal-state
ffunc(internal-state)--->aggregate-value

PostgreSQL创建一个类型为stype的临时变量.它保存这个聚集的当前内部状态.对于每个输入数据条目,都调用状态转换函数计算内部状态值的新数值.在处理完所有数据后,调用一次最终处理函数以计算聚集的输出值.如果没有最终处理函数,那么将最后的状态值当做返回值.
一个聚集函数还可能提供一个初始条件,也就是说,所用的该内部状态值的初始值.这个值是作为类型text的数据域存储在数据库里的,不过它们必须是状态值数据类型的合法的外部表现形式的常量.如果没有提供状态,那么状态值初始化为NULL.
如果在pg_proc里该状态转换函数被定义为"strict",那么NULL输入就不能调用它.这个时候,带有这样的转换函数的聚集执行起来的现象如下所述.NULL输入的值被忽略(不调用此函数并且保留前一个状态值).如果初始状态值是NULL,那么由第一个非NULL值替换该状态值,而状态转换函数从第二个非NULL的输入值开始调用.这样做让我们比较容易实现象max这样的聚集.请注意这种行为只是当state_type与input_data_type相同的时候才表现出来.如果这些类型不同,你必须提供一个非NULL的初始条件或者使用一个非strice的状态转换函数.
如果状态转换函数不是strict(严格)的,那么它将无条件地为每个输入值调用,并且必须自行处理NULL输入和NULL转换值,这样就允许聚集的作者对聚集中的NULL有完全的控制.
如果终转换函数定义为"strict",则如果最终状态值是NULL时就不能调用它;而是自动输出一个NULL的结果.(当然,这才是strict函数的正常特征.)不管是那种情况,终处理函数可以选择返回NULL.比如,avg的终处理函数在零输入记录时就会返回NULL.
注意
使用DROPAGGREGATE删除聚集函数.
CREATEAGGREGATE的参数可以以任何顺序书写,而不只是上面显示的顺序.
用法
请参考PostgreSQL程序员手册聚集函数章节的聚集函数部分获取完整的例子.
兼容性SQL92
CREATEAGGREGATE是PostgreSQL语言的扩展.在里没有CREATEAGGREGATE

CREATECONSTRAINTTRIGGER
CREATECONSTRAINTTRIGGER
Name
CREATECONSTRAINTTRIGGER--定义一个新的约束触发器
Synopsis
CREATECONSTRAINTTRIGGERname
AFTEReventsON
relationconstraintattributes
FOREACHROWEXECUTEPROCEDUREfunc'('args')'

输入
name
约束触发器的名称.
events
触发该触发器的事件范围.
relation
被触发的关系名称.
constraint
实际的约束声明.
attributes
约束属性.
func(args)
触发器处理所调用的函数.
输出
CREATECONSTRAINT
成功创建后的返回信息.
描述
CREATECONSTRAINTTRIGGERCREATE/ALTERTABLE内部使用以及被pg_dump用于创建那些用于参考完整性的特殊的触发器.
这条语句不是做一般用途用的.

CREATEDATABASE
CREATEDATABASE
Name
CREATEDATABASE--创建新数据库
Synopsis
CREATEDATABASEname
[WITH[LOCATION='dbpath']
[TEMPLATE=template]
[ENCODING=encoding]]

输入
name
要创建的数据库名.
dbpath
在文件系统里存储新数据库的可选位置;用字串文本声明.或者用DEFAULT表示使用缺省位置.
template
从哪个模板创建新数据库,这是模板名.或者用DEFAULT使用缺省模板(template1).
encoding
创建新数据库用的多字节编码方法.声明一个字串文本名字(比如,'SQL_ASCII'),或者一个整数编号,或者是DEFAULT表示使用缺省编码.
输出
CREATEDATABASE
命令成功执行的返回信息.
ERROR:user'username'isnotallowedtocreate/dropdatabases
你必须有特殊的CREATEDB权限来创建数据库。参阅SeeCREATEUSER。
ERROR:createdb:database"name"alreadyexists
如果声明的数据库name已经存在返回的信息.
ERROR:databasepathmaynotcontainsinglequotes
数据库路径名dbpath不能包含单引号。这样要求是为了创建数据库目录的shell命令能够正确执行。
ERROR:CREATEDATABASE:maynotbecalledinatransactionblock
如果你有一个明确的事务块正在处理,你不能调用CREATEDATABASE。你必须先结束事务。
ERROR:Unabletocreatedatabasedirectory'path'.
ERROR:Couldnotinitializedatabasedirectory.
这种情况最有可能是因为对数据目录权限不够,磁盘已满或其他文件系统问题。数据库服务器运行的机器上的用户必须能访问该路径。
描述
CREATEDATABASE创建一个新的PostgreSQL数据库.创建者成为新数据库的管理员.
可以声明一个可选的数据库位置,例如,在另一块硬盘上存放数据库。该路径必须是事先用initlocation命令准备好了的.
如果路径名不包含斜杠,那么它被解释成一个环境变量,该变量必须为服务进程所知。这样数据库管理员可以对能够在那里创建数据库进行控制。(例如,一个用户化的选择是'PGDATA2'。)如果服务器带着ALLOW_ABSOLUTE_DBPATHS(缺省时没有)选项编译,那么也允许使用以斜杠开头为标识的绝对路径(例如,''/usr/local/pgsql/data')。
缺省时,新数据库将通过克隆标准系统数据库template1来创建.不同的模板可以用TEMPLATE=name来写.尤其是,如果你用TEMPLATE=template0,你可以创建一个很纯净的数据库,只包括你的版本的PostgreSQL预定义的标准对象.这个方法可以避免把任何已经加入到template1里的本地安装对象拷贝到新数据库.
可选的编码参数允许选择数据库编码,如果你的服务器是带着多字节编码支持编译的话.如果没有声明,缺省是所选用的模板数据库用的编码.
可选参数可以以任意顺序写,而不仅是上面显示的顺序.
注意
CREATEDATABASE是PostgreSQL语言的扩展.
使用DROPDATABASE删除一个数据库.
程序createdb是是这个命令的shell脚本的封装,提供来方便使用。
在用绝对路径指定的可选数据库位置时,有一些安全和数据完整性的问题,而且缺省时只有后端识别的环境变量可以声明为可选的路径.参考管理员手册获取更多的信息.
尽管我们可以通过把某数据库名声明为模板从非template1数据库拷贝数据库,但是这(还)不是一个通用的COPYDATABASE功能.因此,我们建议当做模板使用的数据库都应该是以只读方式对待的.参阅管理员手册获取更多信息.
用法
创建一个新的数据库:
olly=>createdatabaselusiadas;

在另一个地方~/private_db创建新数据库:
$mkdirprivate_db
$initlocation~/private_db
Thelocationwillbeinitializedwithusername"olly".
Thisuserwillownallthefilesandmustalsoowntheserverprocess.
Creatingdirectory/home/olly/private_db
Creatingdirectory/home/olly/private_db/base

initlocationiscomplete.
$psqlolly
Welcometopsql,thePostgreSQLinteractiveterminal.

Type:\copyrightfordistributionterms
\hforhelpwithSQLcommands
\?forhelponinternalslashcommands
\gorterminatewithsemicolontoexecutequery
\qtoquit
olly=>CREATEDATABASEelsewhereWITHLOCATION='/home/olly/private_db';
CREATEDATABASE
兼容性SQL92
在里没有CREATEDATABASE语句.数据库等同于目录,其创建是由实现决定的.

CREATEFUNCTION
CREATEFUNCTION
Name
CREATEFUNCTION--定义一个新函数
Synopsis
CREATE[ORREPLACE]FUNCTIONname([argtype[,...]])
RETURNSrettype
AS'definition'
LANGUAGE'langname'
[WITH(attribute[,...])]
CREATE[ORREPLACE]FUNCTIONname([argtype[,...]])
RETURNSrettype
AS'obj_file','link_symbol'
LANGUAGElangname
[WITH(attribute[,...])]

描述
CREATEFUNCTION定义一个新的函数.CREATEORREPLACEFUNCTION将要么创建一个新函数,要么替换现有的定义.
参数
name
要创建的函数名字.这个名字可以不是唯一的,因为函数可以重载,胆识同名的函数必须有不同的参数类型.
argtype
该函数的数据类型(如果有).输入类型可以是基本类型,也可以是复合类型,opaque,或者和一个现有字段相同的类型.Opaque表示该函数接受非SQL类型,比如char*.一个字段的类型是用tablename.columnname%TYPE表示的;使用这个东西可以帮助函数独立于表定义的修改.
rettype
返回数据类型.输出类型可以声明为一个基本类型,复合类型,setof类型,opaque,或者和现有字段同类型.setof修饰词表示该函数将返回一套条目,而不是一条条目.返回类型声明为opaque的函数不返回数值.它们不能直接调用;触发器函数可以利用这个特性.
definition
一个定义函数的字串;含义取决于语言.它可以是一个内部函数名字,一个指向某个目标文件的路径,一个SQL查询,或者一个用过程语言写的文本.
obj_file,link_symbol
这个形式的AS子句用于在函数的C源文件名字和SQL函数的名字不同的时候动态联接C语言函数.字串obj_file是包含可动态装载的对象的文件名,而link_symbol是对象的联接符号,也就是该函数在C源文件列的名字.
langname
可以是SQL,C,internal,或者plname,这里的plname是一种已创建过程语言的名字.参阅CREATELANGUAGE获取细节.为了保持向下兼容,该名字可以用单引号包围.
attribute
一段可选的有关该函数的信息,用于优化.见下文获取细节.
创建该函数的用户成为该函数所有者.
下面的属性可以出现在WITH子句里∶
iscachable
Iscachable表示此函数在输入相同时总是返回相同的值(也就是说,它不做数据库查找或者是使用没有直接在它的参数列表出现的信息)。优化器使用iscachable来认知对该函数的调用进行预先计算是否安全。
isstrict
isstrict表明如果它的任何参数是NULL,此函数总是返回NULL.如果声明了这个属性,则如果存在NULL参数时不会执行该函数;而只是自动假设一个NULL结果.如果没有声明isstrict该函数将为NULL输入调用并进行处理.那么剩下的事就是函数作者的责任来检查NULL是否必须并且做相应响应.
注意
请参阅PostgreSQL程序员手册关于通过函数扩展PostgreSQL的章节获取更多关于书写外部函数的信息.
我们允许你将完整的SQL类型语法用于输入参数和返回值.不过,有些类型声明的细节(比如,numeric类型的精度域)是由下层函数实现负责的,并且会被CREATEFUNCTION命令悄悄地吞掉.(也就是说,不再被识别或强制).
PostgreSQL允许函数重载;也就是说,同一个函数名可以用于几个不同的函数,只要它们的参数可以区分它们。不过,这个功能在用于internal(内部)和C语言的函数时要小心。
两个internal函数拥有相同C名称时肯定会发生链接时错误。要解决这个问题,给它们赋予不同的C名称(例如,使用参数类型做为C名称的一部分),然后在CREATEFUNCTION的AS子句里面声明这些名字。如果AS子句为空,那么CREATEFUNCTION假设函数的C名称与SQL名称一样。
类似的还有,如果用多个C语言函数重载SQL函数,给每个C语言函数的实例一个独立的名称,然后使用CREATEFUNCTION语法里的AS句的不同形式来选择每个重载的SQL函数的正确的C语言实现.
如果重复调用CREATEFUNCTION,并且都指向同一个目标文件,那么该文件只装载一次.要卸载和恢复装载该文件(可能是在开发过程中),你可以使用LOAD命令.
使用DROPFUNCTION删除一个用户定义函数.
要更新现存函数的定义,用CREATEORREPLACEFUNCTION.请注意不可能用这种方法改变一个函数的名字或者参数类型(如果你这么干,你只是会创建一个新的,不同的函数).同样,CREATEORREPLACEFUNCTION也不会让你改变一个现存函数的返回类型.要干这些事,你必须删除并重新创建该函数.
如果你删除然后重新创建一个函数,新函数和旧的并非相同实体;你会破坏现存的引用了原有函数的规则,视图,触发器等等.使用CREATEORREPLACEFUNCTION可以改变一个函数的定义而又不会破坏引用该函数的对象.
例子
要创建一个简单的SQL函数∶
CREATEFUNCTIONone()RETURNSinteger
AS'SELECT1ASRESULT;'
LANGUAGESQL;
SELECTone()ASanswer;
answer
--------
1
这个例子通过调用一个用户创建的名为funcs.so(扩展名因平台而异)的共享库过程创建一个C函数.该共享库文件应该位于服务器的动态搜索路径里.该路径计算一个检测位并且如果函数参数里的检测位正确就返回一个TRUE.这些可以通过用一个CHECK约束实现的.
CREATEFUNCTIONean_checkdigit(char,char)RETURNSboolean
AS'funcs'LANGUAGEC;
CREATETABLEproduct(
idchar(8)PRIMARYKEY,
eanprefixchar(8)CHECK(eanprefix~'[0-9]{2}-[0-9]{5}')
REFERENCESbrandname(ean_prefix),
eancodechar(6)CHECK(eancode~'[0-9]{6}'),
CONSTRAINTeanCHECK(ean_checkdigit(eanprefix,eancode))
);
这个例子创建一个在用户定义类型complex和内部类型point之间做类型转换的函数。该函数是用一个从C源代码编译的动态装载的对象来实现的。(我们演示了使用声明共享目标文件的准确路径名的过时方法).对于PostgreSQL而言,要自动寻找类型转换函数,SQL函数必须和返回类型同名,因而重载是不可避免的。该函数名通过使用SQL定义里AS子句的第二种类型来重载:
CREATEFUNCTIONpoint(complex)RETURNSpoint
AS'/home/bernie/pgsql/lib/complex.so','complex_to_point'
LANGUAGEC;
该函数的C声明可以是∶
Point*complex_to_point(Complex*z)
{
Point*p;
p=(Point*)palloc(sizeof(Point));
p->x=z->x;
p->y=z->y;
returnp;
}
兼容性SQL92
在SQL99里的确定义了一个CREATEFUNCTIONPostgreSQL的和它类似但是不兼容.这个属性是不可移植的,可以使用的不同语言也是如此.
又见
DROPFUNCTION,LOAD,PostgreSQL程序员手册

CREATEFUNCTION
Name
CREATEFUNCTION--定义一个新函数
Synopsis
CREATE[ORREPLACE]FUNCTIONname([argtype[,...]])
RETURNSrettype
AS'definition'
LANGUAGE'langname'
[WITH(attribute[,...])]
CREATE[ORREPLACE]FUNCTIONname([argtype[,...]])
RETURNSrettype
AS'obj_file','link_symbol'
LANGUAGElangname
[WITH(attribute[,...])]
描述
CREATEFUNCTION定义一个新的函数.CREATEORREPLACEFUNCTION将要么创建一个新函数,要么替换现有的定义.
参数
name
要创建的函数名字.这个名字可以不是唯一的,因为函数可以重载,胆识同名的函数必须有不同的参数类型.
argtype
该函数的数据类型(如果有).输入类型可以是基本类型,也可以是复合类型,opaque,或者和一个现有字段相同的类型.Opaque表示该函数接受非SQL类型,比如char*.一个字段的类型是用tablename.columnname%TYPE表示的;使用这个东西可以帮助函数独立于表定义的修改.
rettype
返回数据类型.输出类型可以声明为一个基本类型,复合类型,setof类型,opaque,或者和现有字段同类型.setof修饰词表示该函数将返回一套条目,而不是一条条目.返回类型声明为opaque的函数不返回数值.它们不能直接调用;触发器函数可以利用这个特性.
definition
一个定义函数的字串;含义取决于语言.它可以是一个内部函数名字,一个指向某个目标文件的路径,一个SQL查询,或者一个用过程语言写的文本.
obj_file,link_symbol
这个形式的AS子句用于在函数的C源文件名字和SQL函数的名字不同的时候动态联接C语言函数.字串obj_file是包含可动态装载的对象的文件名,而link_symbol是对象的联接符号,也就是该函数在C源文件列的名字.
langname
可以是SQL,C,internal,或者plname,这里的plname是一种已创建过程语言的名字.参阅CREATELANGUAGE获取细节.为了保持向下兼容,该名字可以用单引号包围.
attribute
一段可选的有关该函数的信息,用于优化.见下文获取细节.
创建该函数的用户成为该函数所有者.
下面的属性可以出现在WITH子句里∶
iscachable
Iscachable表示此函数在输入相同时总是返回相同的值(也就是说,它不做数据库查找或者是使用没有直接在它的参数列表出现的信息)。优化器使用iscachable来认知对该函数的调用进行预先计算是否安全。
isstrict
isstrict表明如果它的任何参数是NULL,此函数总是返回NULL.如果声明了这个属性,则如果存在NULL参数时不会执行该函数;而只是自动假设一个NULL结果.如果没有声明isstrict该函数将为NULL输入调用并进行处理.那么剩下的事就是函数作者的责任来检查NULL是否必须并且做相应响应.
注意
请参阅PostgreSQL程序员手册关于通过函数扩展PostgreSQL的章节获取更多关于书写外部函数的信息.
我们允许你将完整的SQL类型语法用于输入参数和返回值.不过,有些类型声明的细节(比如,numeric类型的精度域)是由下层函数实现负责的,并且会被CREATEFUNCTION命令悄悄地吞掉.(也就是说,不再被识别或强制).
PostgreSQL允许函数重载;也就是说,同一个函数名可以用于几个不同的函数,只要它们的参数可以区分它们。不过,这个功能在用于internal(内部)和C语言的函数时要小心。
两个internal函数拥有相同C名称时肯定会发生链接时错误。要解决这个问题,给它们赋予不同的C名称(例如,使用参数类型做为C名称的一部分),然后在CREATEFUNCTION的AS子句里面声明这些名字。如果AS子句为空,那么CREATEFUNCTION假设函数的C名称与SQL名称一样。
类似的还有,如果用多个C语言函数重载SQL函数,给每个C语言函数的实例一个独立的名称,然后使用CREATEFUNCTION语法里的AS句的不同形式来选择每个重载的SQL函数的正确的C语言实现.
如果重复调用CREATEFUNCTION,并且都指向同一个目标文件,那么该文件只装载一次.要卸载和恢复装载该文件(可能是在开发过程中),你可以使用LOAD命令.
使用DROPFUNCTION删除一个用户定义函数.
要更新现存函数的定义,用CREATEORREPLACEFUNCTION.请注意不可能用这种方法改变一个函数的名字或者参数类型(如果你这么干,你只是会创建一个新的,不同的函数).同样,CREATEORREPLACEFUNCTION也不会让你改变一个现存函数的返回类型.要干这些事,你必须删除并重新创建该函数.
如果你删除然后重新创建一个函数,新函数和旧的并非相同实体;你会破坏现存的引用了原有函数的规则,视图,触发器等等.使用CREATEORREPLACEFUNCTION可以改变一个函数的定义而又不会破坏引用该函数的对象.
例子
要创建一个简单的SQL函数∶
CREATEFUNCTIONone()RETURNSinteger
AS'SELECT1ASRESULT;'
LANGUAGESQL;
SELECTone()ASanswer;
answer
--------
1
这个例子通过调用一个用户创建的名为funcs.so(扩展名因平台而异)的共享库过程创建一个C函数.该共享库文件应该位于服务器的动态搜索路径里.该路径计算一个检测位并且如果函数参数里的检测位正确就返回一个TRUE.这些可以通过用一个CHECK约束实现的.
CREATEFUNCTIONean_checkdigit(char,char)RETURNSboolean
AS'funcs'LANGUAGEC;
CREATETABLEproduct(
idchar(8)PRIMARYKEY,
eanprefixchar(8)CHECK(eanprefix~'[0-9]{2}-[0-9]{5}')
REFERENCESbrandname(ean_prefix),
eancodechar(6)CHECK(eancode~'[0-9]{6}'),
CONSTRAINTeanCHECK(ean_checkdigit(eanprefix,eancode))
);
这个例子创建一个在用户定义类型complex和内部类型point之间做类型转换的函数。该函数是用一个从C源代码编译的动态装载的对象来实现的。(我们演示了使用声明共享目标文件的准确路径名的过时方法).对于PostgreSQL而言,要自动寻找类型转换函数,SQL函数必须和返回类型同名,因而重载是不可避免的。该函数名通过使用SQL定义里AS子句的第二种类型来重载:
CREATEFUNCTIONpoint(complex)RETURNSpoint
AS'/home/bernie/pgsql/lib/complex.so','complex_to_point'
LANGUAGEC;
该函数的C声明可以是∶
Point*complex_to_point(Complex*z)
{
Point*p;
p=(Point*)palloc(sizeof(Point));
p->x=z->x;
p->y=z->y;
returnp;
}
兼容性SQL92
在SQL99里的确定义了一个CREATEFUNCTIONPostgreSQL的和它类似但是不兼容.这个属性是不可移植的,可以使用的不同语言也是如此.
又见
DROPFUNCTION,LOAD,PostgreSQL程序员手册

CREATEGROUP
CREATEGROUP
Name
CREATEGROUP--定义一个新的用户组
Synopsis
CREATEGROUPname[[WITH]option[...]]

这里option可以是∶

SYSIDgid
|USERusername[,...]

输入
name
组名。
gid
SYSID子句可以用于选择PostgreSQL里新组的组标识(groupid)。不过,这样做不是必须的。
如果没有声明这个,将使用从1开始的,已分配的最高组标识加一作为缺省值。
username
包括到组里面的用户列表。用户必须已经存在。
输出
CREATEGROUP
成功创建组后的返回。
描述
CREATEGROUP将在数据库节点上创建一个新组。参考管理员手册获取关于使用组来认证的信息。要使用这条命令,你必须是数据库超级用户。
使用ALTERGROUP修改组成员,DROPGROUP删除一个组。
用法
创建一个空组:
CREATEGROUPstaff
创建一个有成员的组:
CREATEGROUPmarketingWITHUSERjonathan,david
兼容性SQL92

里没有CREATEGROUP。Roles在概念上与组类似。

CREATELANGUAGE
CREATELANGUAGE
Name
CREATELANGUAGE--定义一种新的过程语言
Synopsis
CREATE[TRUSTED][PROCEDURAL]LANGUAGElangname
HANDLERcall_handler
描述
使用CREATELANGUAGE,一个PostgreSQL用户可以在PostgreSQL里注册一个新的语言.因而,函数和触发器过程可以用这种新语言定义.要注册新语言用户必须具有PostgreSQL超级用户权限.
CREATELANGUAGE将该语言的名字和一个调用句柄关联起来,而该调用句柄负责执行该语言书写的函数.请参考程序员手册获取有关语言调用句柄的更多信息.
请注意过程语言是对每个独立的数据库而言是自己的.要让一种语言缺省时可以为所有数据库获得,那你应该把它安装到template1数据库里.
参数
TRUSTED
TRUSTED说明对该语言的调用句柄是安全的;也就是说,它不会提供给非特权用户任何绕过访问限制的能力.如果忽略这个关键字,只有具有PostgreSQL超级用户权限的人可以使用这个语言创建新的函数.
PROCEDURAL
这是个没有用的字.
langname
新的过程化语言的名称.语言名是大小写无关的.一个过程化语言不能覆盖PostgreSQL内置的语言.
出于向下兼容的原因,这个名字可以用单引号包围.
HANDLERcall_handler
call_handler是一个以前注册过的函数的名字,该函数将被调用来执行这门过程语言写的函数.过程语言的调用句柄必须用一种编译语言书写,比如C,调用风格必须是版本1的调用风格,并且在PostgreSQL里注册为不接受参数并且返回opaque类型的函数,(opaque是用于未声明或未定义类型的占位符).undefinedtypes.
诊断
CREATE
如果语言成功创建,返回此信息.
ERROR:PLhandlerfunctionfuncname()doesn'texist
如果没有找到函数funcname(),则返回此信息.
注意
这条命令通常不应该由用户直接执行.对于PostgreSQL版本里提供的过程语言,我们应该使用createlang脚本,它将为我们安装正确的调用句柄.(createlang也会在内部调用CREATELANGUAGE.)
使用CREATEFUNCTION命令创建新函数.
使用DROPLANGUAGE,或者更好是droplang脚本删除一个过程语言.
系统表pg_language记录了更多有关当前安装的过程语言的信息.
Table"pg_language"
Attribute|Type|Modifier
---------------+---------+----------
lanname|name|
lanispl|boolean|
lanpltrusted|boolean|
lanplcallfoid|oid|
lancompiler|text|

lanname|lanispl|lanpltrusted|lanplcallfoid|lancompiler
-------------+---------+--------------+---------------+-------------
internal|f|f|0|n/a
C|f|f|0|/bin/cc
sql|f|f|0|postgres
目前,一种过程语言创建之后它的定义就不能再更改.
例子
下面两条顺序执行的命令将注册一门新的过程语言及其关联的调用句柄.
CREATEFUNCTIONplsample_call_handler()RETURNSopaque
AS'$libdir/plsample'
LANGUAGEC;
CREATELANGUAGEplsample
HANDLERplsample_call_handler;
兼容性SQL92
CREATELANGUAGE是PostgreSQL扩展.
历史
CREATELANGUAGE命令第一次出现在PostgreSQL6.3.
又见
createlang,CREATEFUNCTION,droplang,DROPLANGUAGE,PostgreSQL程序员手册

CREATEOPERATOR
CREATEOPERATOR
Name
CREATEOPERATOR--定义一个新的操作符
Synopsis
CREATEOPERATORname(PROCEDURE=func_name
[,LEFTARG=lefttype
][,RIGHTARG=righttype]
[,COMMUTATOR=com_op][,NEGATOR=neg_op]
[,RESTRICT=res_proc][,JOIN=join_proc]
[,HASHES][,SORT1=left_sort_op][,SORT2=right_sort_op])

输入
name
要定义的操作符。可用的字符见下文。
func_name
用于实现该操作符的函数。
lefttype
如果存在的话,操作符左手边的参数类型.如果是左目操作符,这个参数可以省略。
righttype
如果存在的话,操作符右手边的参数类型.如果是右目操作符,这个参数可以省略。
com_op
该操作符对应的交换(commutator)操作符。
neg_op
对应的负操作符。
res_proc
此操作符约束选择性计算函数。
join_proc
此操作符连接选择性计算函数。
HASHES
表明此操作符支持哈希(散列)连接。
left_sort_op
如果此操作符支持融合连接(join),此操作符的左手边数据的排序操作符。
right_sort_op
如果此操作符支持融合连接(join),此操作符的右手边数据的排序操作符。
输出
CREATE
成功创建操作符后的返回信息.
描述
CREATEOPERATOR定义一个新的操作符,name.定义该操作符的用户成为其所有者.
操作符name是一个最多NAMEDATALEN-1长的(缺省为31个)下列字符组成的字串:
+-*/<>=~!@#%^&|`?$
你选择名字的时候有几个限制:

"$"和":"不能定义为单字符操作符,但是它们可以是一个多字符操作符的名称的一部分.
"--"和"/*"不能在操作符名字的任何地方出现,因为它们会被认为是一个注释的开始.
一个多字符的操作符名字不能以"+"或"-"结尾,除非该名字还包含至少下面字符之一:

~!@#%^&|`?$
例如,@-是一个允许的操作符名,但*-不是.这个限制允许PostgreSQL分析SQL-有问题的查询而不要求在符号之间有空白.
注意:当使用非SQL-标准操作符名时,你通常将需要用空白把联接的操作符分离开以避免含混.例如,如果你定义了一个左目操作符,名为"@",你不能写X*@Y;你必须写成X*@Y以保证PostgreSQL把它读做两个操作符而不是一个.
操作符"!="在输入时映射成"<>",因此这两个名称总是相等的.
至少需要定义一个LEFTARG或RIGHTARG.对于双目操作符来说,两者都需要定义.对右目操作符来说,只需要定义LEFTARG,而对于左目操作符来说,只需要定义RIGHTARG.
同样,func_name过程必须已经用CREATEFUNCTION定义过,而且必须定义为接受正确数量的指定类型参数(一个或是两个).
如果存在换向操作符则必须指明,这样PostgreSQL可以按它的意愿转换操作符的方向.例如,操作符面积小于,<<<,很有可能有一个转换操作符:面积大于操作符,>>>.因此,查询优化器可以自由的将下面查询从:
box'((0,0),(1,1))'>>>MYBOXES.description
转换到
MYBOXES.description<<<box'((0,0),(1,1))'
这就允许执行代码总是使用后面的形式而某种程度上简化了查询优化器.
类似地,如果存在负号操作符则也应该声明。假设一个操作符,面积相等,===,存在,同样有一个面积不等操作符,!==.负号操作符允许查询优化器将
NOTMYBOXES.description===box'((0,0),(1,1))'

简化成
MYBOXES.description!==box'((0,0),(1,1))'
如果提供了一个交换操作符名称,PostgreSQL将在表中查找它.如果找到,而且其本身没有一个交换符,那么交换符表将被更新,以当前(最新)创建的操作符作为它的交换符.这一点一样适用于负号操作符.这就允许定义两个互为交换符或负号符的操作符.第一个操作符应该定义为没有交换符或负号符(asappropriate).当定义第二个操作符时,将第一个符号作为交换符或负号符.第一个将因上述的副作用一样被更新(而获得交换符或负号符).(对于PostgreSQL6.5,把两个操作符指向对方同样也行。)
HASHES,SORT1 和SORT2选项将为查询优化器进行连接查询时提供支持.PostgreSQL能够总是用反复替换来计算一个连接(也就是说,处理这样的子句,该子句有两个元组变量,这两个变量被一个操作符分开,这个操作符返回一个boolean量)[WONG76].另外,PostgreSQL可以延着[SHAP86]实现一个散列-连接算法(hash-joinalgorithm);但是,我们必须知道这个策略是否可行.目前的散列-连接算法只是对代表相等测试的操作符有效;而且,数据类型的相等必须意味着类型的表现是按位相等的。(例如,一个包含未用的位的数据类型,这些位对相等测试没有影响,但却不能用于哈希连接。)HASHES标记告诉优化器,对这个操作符可以安全地使用哈希连接。
类似的,两目排序操作符告诉查询优化器一个融合-排序(merge-sort)是否是一个可用的连接策略,并且告诉优化器使用哪个操作符来对这两个操作数表排序.排序操作符应该只提供给相等操作符,并且它们应该对应用于相应的左边和右边数据类型的小于操作符。
如果发现有其他联合策略可用,PostgreSQL将更改优化器和运行时系统以利用这些策略,并且在定义一个操作符时将需要更多的声明.幸运的是,研究团队不经常发明新的联合策略,而且增加用户定义联合策略的方法看来与其实现的复杂性相比是不值得的。
RESTRICT和JOIN选项帮助优化器计算结果的尺寸大小.如果像下面的语句:
MYBOXES.description<<<box'((0,0),(1,1))'
在判断条件中出现,那么PostgreSQL将不得不估计MYBOXES中满足该子句的记录数量的范围的大小.函数res_proc必需是一个注册过的函数(也就是说它已经用CREATEFUNCTION定义过了),它接受一个正确数据的数据类型作为参数,返回一个浮点数.查询优化器只是简单的调用这个函数,将参数((0,0),(1,1))传入并且把结果乘以关系(表)尺寸以获得所需要的记录的数值。
类似的,当操作符的两个操作数都包含记录变量时,优化器必须计算联合结果的尺寸.函数join_proc将返回另一个浮点数,这个数就是将两个表相关的记录相乘,计算出预期结果的尺寸.
函数
my_procedure_1(MYBOXES.description,box'((0,0),(1,1))')

和操作符
MYBOXES.description===box'((0,0),(1,1))'
之间的区别是PostgreSQL试图优化操作符并且可以决定使用索引来缩小相关操作符的搜索区间.但是,对函数将不会有任何优化的动作,而且是强制执行.最后,函数可有任意个参数,而操作符限于一个或两个.
注意
请参阅PostgreSQL用户手册中操作符章节获取更多信息.请使用DROPOPERATOR从数据库中删除用户定义操作符.
用法
下面命令定义一个新操作符,面积相等,用于BOX数据类型.
CREATEOPERATOR===(
LEFTARG=box,
RIGHTARG=box,
PROCEDURE=area_equal_procedure,
COMMUTATOR====,
NEGATOR=!==,
RESTRICT=area_restriction_procedure,
JOIN=area_join_procedure,
HASHES,
SORT1=<<<,
SORT2=<<<
);
兼容性SQL92
CREATEOPERATOR是PostgreSQL扩展.在中没有CREATEOPERATOR语句.

CREATERULE
CREATERULE
Name
CREATERULE--定义一个新的重写规则
Synopsis
CREATERULEnameASONevent
TOobject[WHEREcondition]
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的查询可以是任何SQLSELECT,INSERT,UPDATE,DELETE,或NOTIFY语句之一.
在condition和action里,特殊表名字new和old可以用于指向引用表(object)里的数值new在ONINSERT和ONUPDATE规则里可以指向被插入或更新的新行.old在ONUPDATE,和ONDELETE规则里可以指向现存的被更新,或者删除的行.
输出
CREATE
成功创建规则后的返回信息.
描述
PostgreSQL规则系统允许我们在从数据库或表中更新,插入或删除东西时定义一个可选的动作来执行。目前,规则用于实现表视图。
规则的语意是在一个单独的记录正被访问,更新,插入或删除时,将存在一个旧记录(用于检索,更新和删除)和一个新记录(用于更新和追加).这时给定事件类型和给定目标对象(表)的所有规则都将被检查,(顺序不定).如果在WHERE(如果有)子句里面所声明的condition?为真,那么action部分的规则就被执行.如果声明了INSTEAD,那么action就会代替原来的查询;否则,如果是ONINSERT那么它在原来的查询之后执行,如果是ONUPDATE或者ONDELETE,那么它在原来的查询之前执行.在condition和action里面,在旧记录里字段的数值和/或新记录里字段的数值被old.attribute-name和new.attribute-name代替.
规则的action部分可以由一条或者多条查询组成.要写多个查询,用圆括弧或者方括弧把它们包围起来.这样的查询将以声明的顺序执行(只是我们不能保证对一个对象的多个规则的执行顺序).action还可以是NOTHING表示没有动作.因此,一个DOINSTEADNOTHING规则制止了原来的查询的运行(当条件为真时);DONOTHING规则是没有用的.
规则的action部分执行的时候带有和触发动作的用户命令相同的命令和事务标识符.
规则和视图
目前,ONSELECT规则必须是无条件的INSTEAD规则并且必须有一个由一条SELECT查询组成的动作.因此,一条ONSELECT规则有效地把对象表转成视图,它的可见内容是规则的SELECT查询返回的记录而不是存储在表中的内容(如果有的话).我们认为写一条CREATEVIEW命令比创建一个表然后定义一条ONSELECT规则在上面的风格要好.
CREATEVIEW创建一个虚拟表(没有下层的存储)以及相关的ONSELECT规则.系统不允许对视图进行更新,因为它知道在视图上没有真正的表.你可以创建一个可以更新的视图的幻觉,方法是在视图上定义ONINSERT,ONUPDATE,和ONDELETE规则(或者满足你需要的任何上述规则的子集),用合适的对其它表的更新替换在视图上更新的动作.
如果你想在视图更新上使用条件规则,那么这里就有一个补充∶对你希望在视图上允许的每个动作,你都必须有一个无条件的INSTEAD规则.如果规则是有条件的,或者它不是INSTEAD,那么系统仍将拒绝执行更新动作的企图,因为它认为它最终会在某种程度上在虚拟表上执行动作.如果你想处理条件规则上的所由有用的情况,那也可以;只需要增加一个无条件的DOINSTEADNOTHING规则确保系统明白它将决不会被调用来更新虚拟表就可以了.然后把条件规则做成非INSTEAD;在这种情况下,如果它们被触发,那么它们就增加到缺省的INSTEADNOTHING动作中.
注意
为了在表上定义规则,你必须有规则定义权限.用GRANTREVOKE修改权限.
有一件很重要的事情是要避免循环规则.比如,尽管下面两条规则定义都是PostgreSQL可以接受的,select命令会导致PostgreSQL报告一条错误信息,因为该查询循环了太多次:
CREATERULEbad_rule_combination_1AS
ONSELECTTOemp
DOINSTEAD
SELECT*FROMtoyemp;
CREATERULEbad_rule_combination_2AS
ONSELECTTOtoyemp
DOINSTEAD
SELECT*FROMemp;
下面这个对EMP的查询企图将导致PostgreSQL产生一个错误信息,因为该查询循环了太多次:
SELECT*FROMemp;
目前,如果一个规则包含一个NOTIFY查询,那么该NOTIFY将被无条件执行---也就是说,如果规则不施加到任何行上头,该NOTIFY也会被发出.比如,在
CREATERULEnotify_meASONUPDATETOmytableDONOTIFYmytable;
UPDATEmytableSETname='foo'WHEREid=42;
里,一个NOTIFY事件将在UPDATE的时候发出,不管是否有某行的id=42.这是一个实现的限制,将来的版本应该修补这个毛病.
兼容性SQL92
CREATERULE语句是PostgreSQL语言的扩展.在里没有CREATERULE语句.

CREATESEQUENCE
CREATESEQUENCE
Name
CREATESEQUENCE--创建一个新的序列发生器
Synopsis
CREATE[TEMPORARY|TEMP]SEQUENCEseqname[INCREMENTincrement]
[MINVALUEminvalue][MAXVALUEmaxvalue]
[STARTstart][CACHEcache][CYCLE]
输入
TEMPORARY或TEMP
如果声明了这个修饰词,那么该序列对象只为这个会话创建,并且在会话结束的时候自动删除.在临时序列存在的时候,同名永久序列是不可见的(在同一会话里).
seqname
将要创建的序列号名.
increment
INCREMENTincrement子句是可选的.一个正数将生成一个递增的序列,一个负数将生成一个递减的序列.缺省值是一(1).
minvalue
可选的子句MINVALUEminvalue决定一个序列可生成的最小值.缺省分别是递增序列为1递减为-2^63-1.
maxvalue
使用可选子句MAXVALUEmaxvalue决定序列的最大值.缺省的分别是递增为-2^63-1,递减为-1.
start
可选的STARTstart子句使序列可以从任意位置开始.缺省初始值是递增序列为minvalue递减序列为maxvalue.
cache
CACHEcache选项使序列号预分配并且为快速访问存储在内存里面.最小值(也是缺省值)是1(一次只能生成一个值,也就是说没有缓存).
CYCLE
可选的CYCLE关键字可用于使序列到达最大值(maxvalue)或最小值(minvalue)时可复位并继续下去.如果达到极限,生成的下一个数据将分别是最小值(minvalue)或最大值(maxvalue).如果没有CYCLE,那么在到达极限之后再调用nextval将返回错误.
输出
CREATE
命令成功执行的返回信息.
ERROR:Relation'seqname'alreadyexists
如果声明的序列已经存在.
ERROR:DefineSequence:MINVALUE(start)can'tbe>=MAXVALUE(max)
如果声明的初始值超出范围,返回此信息.
ERROR:DefineSequence:STARTvalue(start)can'tbe<MINVALUE(min)
如果声明的初始值超出范围,返回此信息.
ERROR:DefineSequence:MINVALUE(min)can'tbe>=MAXVALUE(max)
如果最小值和最大值不连贯.
描述
CREATESEQUENCE将向当前数据库里增加一个新的序列号生成器.包括创建和初始化一个新的名为seqname的单行表.生成器将为使用此命令的用户"所有".
在序列创建后,你可以使用函数nextval,currval和nextval操作序列.这些函数在用户手册中有详细文档.
尽管你不能直接更新一个序列,但你可以使用象
SELECT*FROMseqname;

检查一个序列的参数和当前状态.特别是序列的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将不会被其它后端知晓,直道它们用光所有预先分配的缓存数值.
注意
使用DROPSEQUENCE语句来删除序列.
序列是基于bigint运算的,因此其范围不能超过八字节的整数范围(-9223372036854775808到9223372036854775807).在一些老一点的平台上可能没有对八字节整数的编译器支持,这种情况下序列使用普通的integer运算(范围是-2147483648到+2147483647).
如果cache大于一,那么每个后端使用其自身的缓存来存储分配的数字.已分配但当前会话没有使用的数字将丢失,导致序列里面出现"空洞".
用法
创建一个叫serial的递增序列,从101开始:
CREATESEQUENCEserialSTART101;
从此序列中选出下一个数字:
SELECTnextval('serial');
nextval
-------
114
在一个INSERT中使用此序列:
INSERTINTOdistributorsVALUES(nextval('serial'),'nothing');
在一个COPYFROM后更新序列:
BEGIN;
COPYdistributorsFROM'input_file';
SELECTsetval('serial',max(id))FROMdistributors;
END;
兼容性SQL92
CREATESEQUENCE是PostgreSQL语言扩展.在里没有CREATESEQUENCE语句.

CREATETABLEAS
CREATETABLEAS
Name
CREATETABLEAS--从一条查询的结果中创建一个新表
Synopsis
CREATE[[LOCAL]{TEMPORARY|TEMP}]TABLEtable_name[(column_name[,...])]
ASquery
描述
CREATETABLEAS创建一个表并且用来自SELECT命令计算出来的数据填充该表.该表的字段和SELECT输出字段的名字及类型相关.(只不过你可以通过明确地给出一个字段名字列表来覆盖SELECT的字段名).
CREATETABLEAS和创建视图有点象,不过两者之间实在是有比较大差异∶它创建一个新表并且只对SELECT计算一次来填充这个新表.新表不能跟踪SELECT的源表随后做的变化.相比之下,每次做查询的时候,视图都重新计算SELECT
这条命令和SELECTINTO有相同的功能,但是我们建议你多用这条命令,因为它不象SELECT...INTO语法那样融合和一些其它用法混淆.,
参数
[LOCAL]TEMPORARY或[LOCAL]TEMP
如果声明了这个选项,则该表作为临时表创建.临时表在会话退出的时候自动删除.在该临时表存在的期间(本次会话),同名的永久表是不可见的.任何在临时表上创建的索引也自动是临时的.
LOCAL关键字是可选的.
table_name
要创建的表名.这个表不能是已经存在的.不过,临时表可以创建为和现有永久表同名.(译注∶这里指的是同名临时表或永久表不能已经存在)
column_name
字段的名称.多字段的名称可以用逗号分隔的字段名列表声明.如果没有提供字段名子,那么就从查询的输出字段名中获取.
query
有效的查询语句(也就是一条SELECT命令),请参考SELECT获取可以使用的语法的描述.
诊断
请参考CREATETABLE和SELECT获取可能的输出的概要.
注意
这条命令从功能上等效于SELECTINTO,但是我们更建议你用这个命令,因为它不太可能和SELECT...INTO语法的其它方面的使用混淆.
兼容性SQL92
这条命令是根据Oracle的一个特性制作的.在或SQL99中没有功能相等的命令.不过,把CREATETABLE和INSERT...SELECT组合起来可以通过略微多一些的工作完成同样的事情.
历史
自PostgreSQL6.3开始就已经有CREATETABLEAS命令了.
又见
CREATETABLE,CREATEVIEW,SELECT,SELECTINTO

CREATETABLE
CREATETABLE
Name
CREATETABLE--定义一个新表
Synopsis
CREATE[[LOCAL]{TEMPORARY|TEMP}]TABLEtable_name(
{column_namedata_type[DEFAULTdefault_expr][column_constraint[,...]]
|table_constraint}[,...]
)
[INHERITS(parent_table[,...])]
[WITHOIDS|WITHOUTOIDS]

这里column_constraint可以是:

[CONSTRAINTconstraint_name]
{NOTNULL|NULL|UNIQUE|PRIMARYKEY|
CHECK(expression)|
REFERENCESreftable[(refcolumn)][MATCHFULL|MATCHPARTIAL][ONDELETEaction][ONUPDATEaction]}
[DEFERRABLE|NOTDEFERRABLE][INITIALLYDEFERRED|INITIALLYIMMEDIATE]

而table_constraint可以是:

[CONSTRAINTconstraint_name]
{UNIQUE(column_name[,...])|PRIMARYKEY(column_name[,...
])|
CHECK(expression)|
FOREIGNKEY(column_name[,...
])REFERENCESreftable[(refcolumn[,...])]
[MATCHFULL|MATCHPARTIAL][ONDELETEaction][ONUPDATEaction]}
[DEFERRABLE|NOTDEFERRABLE][INITIALLYDEFERRED|INITIALLYIMMEDIATE]

描述
CREATETABLE将在当前数据库创建一个新的,初始为空的表.该表将由发出此命令的用户所有.
CREATETABLE还自动创建一个数据类型,该数据类型代表对应该表一行的元组类型(结构类型).因此,表不能和一个现有数据类型同名.
一个表的字段数不能超过1600.(实际上,真正的限制比这低,因为还有元组长度的约束).表不能和系统表同名.
可选的约束子句声明约束(或者测试),新行或者更新的行必须满足这些约束才能成功插入或更新.约束是一个命名的规则∶它是一个SQL对象,它通过对发生在表上的插入,更新或者删除操作的结果进行限制来协助我们定义有效的数值集合.
定义约束又两种方法∶表约束和列约束.一个列约束是作为一个列定义的一部分定义的.而表约束并不和某个列绑在一起,它可以作用于多于一个列上.每个列约束也可以写成表约束;如果某个约束只影响一个列,那么列约束只是符号上的简洁方式而已.
参数
[LOCAL]TEMPORARY或[LOCAL]TEMP
如果声明了此参数,则该表创建为临时表.临时表在会话结束时自动删除.现有同名永久表在临时表存在期间在本会话过程中是不可见的.任何在临时表上创建的索引也都会自动删除.
关键字LOCAL是可选的.又见兼容性SQL92.
table_name
要创建的表的名字.
column_name
在新表中要创建的字段名字.
data_type
该字段的数据类型.它可以包括数组说明符.请参考用户手册获取有关数据类型和数组的更多信息.
DEFAULTdefault_expr
DEFAULT子句给它所出现的字段一个缺省数值.该数值可以是任何不含变量的表达式(不允许使用子查询和对本表中的其它字段的交叉引用).缺省表达式的数据类型必须和字段类型匹配.
缺省表达式将被用于任何未声明该字段数值的插入操作.如果字段上没有缺省值,那么缺省是NULL.
INHERITS(parent_table[,...])
可选的INHERITS子句声明一列表,这个新表自动从这列表中继承所有字段.如果在多于一个父表中存在同名的字段,那么就会报告一个错误,除非这些字段的数据类型在每个父表里都是匹配的.如果没有冲突,那么重复的字段在新表中融合成一个字段.如果新表的字段名列表中包括和继承的字段同名的,那么它的数据类型也必须和上面一样与继承字段匹配,并且这些字段定义会融合成一个.不过,同名的继承和新字段声明可以声明不同的约束∶所有的继承过来的约束以及声明的约束都融合到一起,并且全部应用于新表.如果新表为该字段明确的声明了一个缺省数值,那么此缺省数值覆盖任何来自继承字段声明的缺省值.否则,任何为该字段声明了缺省数值的父表都必须声明相同的缺省,否则就会报告一个错误.
WITHOIDS或WITHOUTOIDS
这个可选的子句声明新表中的行是否应该拥有赋予它们的OID(对象标识).缺省是有OID.(如果新表从任何有OID的表继承而来,那么就算这条命令说了WITHOUTOIDS,也会强制WITHOIDS.)
声明WITHOUTOIDS允许用户禁止为行或者表生成OID.这么做对大表是值得的,因为这样可以减少OID消耗并且推迟32位OID计数器的消耗.一旦该计数器重叠,那么就不能再假设OID的唯一,这样它的实用性就大打折扣.
CONSTRAINTconstraint_name
列或表约束的可选名字.如果没有声明,则由系统生成一个名字.
NOTNULL
字段不允许包含NULL数值.等效于列约束CHECK(columnNOTNULL).
NULL
该字段允许包含NULL数值.这是缺省.
这个子句的存在只是为和那些非标准SQL数据库兼容.我们不建议在新应用中使用它.
UNIQUE(columnconstraint)
UNIQUE(column_name[,...])(tableconstraint)
UNIQUE声明一个规则,该规则表示一个表里的一个或者多个独立的字段组合的分组只能包含唯一的数值.表的唯一约束的行为和列约束的一样,只不过多了跨多行的能力.
对于唯一约束的用途而言,系统认为NULL数值是不相等的.
每个唯一表约束都必须命名一个字段的集合,该集合必须和其它唯一约束命名字段集合或者该表定义的主键约束不同.(否则就只是同样的约束写了两次.)
PRIMARYKEY(columnconstraint)
PRIMARYKEY(column_name[,...])(tableconstraint)
主键约束表明表中的一个或者一些字段只能包含唯一(不重复)非NULL的数值.从技术上讲,PRIMARYKEY只是UNIQUE和NOTNULL的组合,不过把一套字段标识为主键同时也体现了大纲设计的元数据,因为主键意味着其它表可以拿这套字段用做行的唯一标识.
一个表只能声明一个主键,不管是作为字段约束还是表约束.
主键约束应该定义在同个表上的一个与其它唯一约束所定义的不同的字段集合上.
CHECK(expression)
CHECK约束声明一个完整性约束或者测试,一次插入或者更新操作若想成功则必须满足这个条件.每个约束都必须是一个生成布尔结果的表达式.一个在字段定义中出现的
目前,CHECK表达式不能包含子查询或者引用除本行字段之外的变量.
REFERENCESreftable[(refcolumn)][MATCHmatchtype][ONDELETEaction][ONUPDATEaction](columnconstraint)
FOREIGNKEY(column[,...])REFERENCESreftable[(refcolumn[,...])][MATCHmatchtype][ONDELETEaction][ONUPDATEaction](tableconstraint)
REFERENCES列约束声明一个由新表中一列或者多列组成的组应该只包含匹配引用的表reftable中对应引用的字段refcolumn中的数值.如果省略refcolumn,则使用reftable的主键.被引用字段必须是被引用表中的唯一字段或者主键.
向这些字段增加的数值将使用给出的匹配类型与参考表中的参考列中的数值进行匹配.有三种匹配类型∶MATCHFULL,MATCHPARTIAL,和一种缺省匹配类型(如果没有声明匹配类型的话).MATCHFULL将不允许一个多字段外键的字段为NULL,除非所有外键字段都为NULL.缺省匹配类型允许某些外键字段为NULL而外键的其它部分不是NULL.MATCHPARTIAL还没实现.
另外,当被参考字段中的数据改变的时候,那么将对本表的字段中的数据执行某种操作.ONDELETE子句声明当被参考表中的被参考行将被删除的时候要执行的操作.类似,ONUPDATE子句声明被参考表中被参考字段更新为新值的时候要执行的动作.如果该行被更新,但被参考的字段实际上没有变化,那么就不会有任何动作.下面是每个子句的可能的动作∶
NOACTION
生成一个错误,表明删除或者更新将产生一个违反外键约束的动作.它是缺省动作.
RESTRICT
和NOACTION一样.
CASCADE
删除任何引用了被删除行的行,或者分别把引用行的字段值更新为被参考字段的新数值.
SETNULL
把引用行数值设置为NULL.
SETDEFAULT
把引用列的数值设置为它们的缺省值.
如果主键字段经常更新,那么我们给REFERENCES字段增加一个索引可能是合适的,这样与REFERENCES字段相关联的NOACTION和CASCADE动作可以更有效地执行.
DEFERRABLE或NOTDEFERRABLE
这两个关键字设置该约束是否可推迟.一个不可推迟的约束将在每条命令之后马上检查.可以推迟的约束检查可以推迟到事务结尾(使用SETCONSTRAINTS命令).缺省是NOTDEFERRABLE.目前只有外键约束接受这个子句.所有其它约束类型都是不可推迟的.
INITIALLYIMMEDIATEorINITIALLYDEFERRED
如果约束是可推迟的,那么这个子句声明检查约束的缺省时间.如果约束是INITIALLYIMMEDIATE,那么每条语句之后就检查它.这个是缺省.如果约束是INITIALLYDEFERRED,那么只有在事务结尾才检查它.约束检查的时间可以用SETCONSTRAINTS命令修改.
诊断
CREATE
如果表成功创建,返回此信息.
ERROR
如果表创建失败返回这条信息.通常它还带着一些描述性文本,比如∶ERROR:Relation'table'alreadyexists,这个错误出现在运行时--如果声明的表已经在数据库中存在了.
注意

如果一个应用使用了OID标识表中的特定行,那么我们建议在该表的oid字段上创建一个唯一约束,以确保该表的OID即使在计数器重叠之后也是唯一的.如果你需要一个整个数据库范围的唯一标识,那么就要避免假设OID是跨表唯一的,你可以用tableoid和行OID的组合来实现这个目的.(将来的PostgreSQL很可能为每个表使用独立的OID计数器,因此包括tableoid组成数据库范围内的唯一标识将是必须的,而不是可选的.)

提示:对那些没有主键的表,我们不建议使用WITHOUTOIDS,因为如果既没有OID又没有唯一数据键字,那么就很难标识特定的行.

PostgreSQL自动为每个唯一约束和主键约束创建一个索引以确保唯一性.因此,我们不必为主键字段创建明确的索引.(参阅CREATEINDEX获取更多信息.)
SQL92标准认为CHECK字段约束只能引用它们施加的字段;只有CHECK表约束可以引用多个字段.PostgreSQL并未强制这样的限制;它把字段约束和表约束看成是类似的.
唯一约束和主键在目前的实现里是不能继承的.这样,如果把继承和唯一约束组合在一起会导致无法运转.

例子
创建表films和distributors∶
CREATETABLEfilms(
codeCHARACTER(5)CONSTRAINTfirstkeyPRIMARYKEY,
titleCHARACTERVARYING(40)NOTNULL,
didDECIMAL(3)NOTNULL,
date_prodDATE,
kindCHAR(10),
lenINTERVALHOURTOMINUTE
);
CREATETABLEdistributors(
didDECIMAL(3)PRIMARYKEYDEFAULTNEXTVAL('serial'),
nameVARCHAR(40)NOTNULLCHECK(name<>'')
);
创建一个带有2维数组的表∶
CREATETABLEarray(
vectorINT[][]
);
为表films定义一个唯一表约束.唯一表约束可以在表的一个或多个字段上定义∶
CREATETABLEfilms(
codeCHAR(5),
titleVARCHAR(40),
didDECIMAL(3),
date_prodDATE,
kindVARCHAR(10),
lenINTERVALHOURTOMINUTE,
CONSTRAINTproductionUNIQUE(date_prod)
);
定义一个检查列约束∶
CREATETABLEdistributors(
didDECIMAL(3)CHECK(did>100),
nameVARCHAR(40)
);
定义一个检查表约束∶
CREATETABLEdistributors(
didDECIMAL(3),
nameVARCHAR(40)
CONSTRAINTcon1CHECK(did>100ANDname<>'')
);
为表films定义一个主键表约束.主键表约束可以定义在表上的一个或多个字段.
CREATETABLEfilms(
codeCHAR(5),
titleVARCHAR(40),
didDECIMAL(3),
date_prodDATE,
kindVARCHAR(10),
lenINTERVALHOURTOMINUTE,
CONSTRAINTcode_titlePRIMARYKEY(code,title)
);
为表distributors定义一个主键约束.下面两个例子是等效的,第一个例子使用了表约束语法,第二个使用了列约束表示法.
CREATETABLEdistributors(
didDECIMAL(3),
nameCHARVARYING(40),
PRIMARYKEY(did)
);
CREATETABLEdistributors(
didDECIMAL(3)PRIMARYKEY,
nameVARCHAR(40)
);
下面这个例子给字段name赋予了一个文本常量缺省值,并且将字段did的缺省值安排为通过选择序列对象的下一个值生成.modtime的缺省值将是该行插入的时候的时间.
CREATETABLEdistributors(
nameVARCHAR(40)DEFAULT'lusofilms',
didINTEGERDEFAULTNEXTVAL('distributors_serial'),
modtimeTIMESTAMPDEFAULTCURRENT_TIMESTAMP
);
在表distributors上定义两个NOTNULL列约束,其中之一明确给出了名字∶
CREATETABLEdistributors(
didDECIMAL(3)CONSTRAINTno_nullNOTNULL,
nameVARCHAR(40)NOTNULL
);
为name字段定义一个唯一约束∶
CREATETABLEdistributors(
didDECIMAL(3),
nameVARCHAR(40)UNIQUE
);
上面的和下面这样作为一个表约束声明是一样的∶
CREATETABLEdistributors(
didDECIMAL(3),
nameVARCHAR(40),
UNIQUE(name)
);
兼容性SQL92
CREATETABLE遵循和SQL99的一个子集的中间状态,一些例外情况在下面和上面的诊断中列出.
临时表
除了局部临时表之外,还定义了CREATEGLOBALTEMPORARYTABLE语句.全局临时表也可以在其它会话中可见.
对于临时表,有一个可选的ONCOMMIT子句∶
CREATE{GLOBAL|LOCAL}TEMPORARYTABLEtable(...)[ONCOMMIT{
DELETE|PRESERVE}ROWS]
ONCOMMIT子句表明该临时表在执行COMMIT的时候是否应该清空行.如果省略了ONOMMIT子句,声明缺省是ONCOMMITDELETEROWS.不过,PostgreSQL的行为总是类似ONCOMMITPRESERVEROWS.
NULL"约束"
NULL"约束"(实际上不是约束)是PostgreSQL对的扩展,包括它是为了和其它一些RDBMS兼容(以及为了和NOTNULL约束对称).因为它是任何字段的缺省,所以它的出现只是噪音而已.
断言
断言是一种特殊类型的完整性约束,它和其它约束共享相同的名字空间.不过,断言和约束不同的是,它不一定依赖于某个特定的表,因此提供了CREATEASSERTION语句作为定义约束的一个可选的方法∶
CREATEASSERTIONnameCHECK(condition)
PostgreSQL目前还没有实现断言.
继承
通过INHERITS子句的多重继承是PostgreSQL语言的扩展.SQL99(但不包括)使用不同的语法和语义定义了单继承.SQL99风格的继承还没有在PostgreSQL中实现.
对象ID
PostgreSQL的OID的概念不是标准.
又见
ALTERTABLE,DROPTABLE

CREATETRIGGER
Name
CREATETRIGGER--定义一个新的触发器
Synopsis
CREATETRIGGERname{BEFORE|AFTER}{event[OR...]}
ONtableFOREACH{ROW|STATEMENT}
EXECUTEPROCEDUREfunc(arguments)
输入
name
赋予新触发器的名称.
table
现有表名称.
event
INSERT,DELETE或UPDATE之一.
func
一个用户提供的函数.
输出
CREATE
如果触发器成功创建,返回此信息.
描述
CREATETRIGGER将向现有数据库中增加一个新的触发器.触发器将与表table相联并且将执行声明的函数func.
触发器可以声明为在对记录进行操作之前在检查约束之前和INSERTUPDATEDELETE执行前)或之后(在检查约束之后和完成INSERTUPDATEDELETE操作)触发.如果触发器在事件之前,触发器可能略过当前记录的操作或改变被插入的(当前)记录(只对INSERTUPDATE操作有效).如果触发器在事件之后,所有更改,包括最后的插入,更新或删除对触发器都是"可见"的.
SELECT并不更改任何行,因此你不能创建SELECT触发器.这种场合下规则和视图更合适些.
请参考PostgreSQL程序员手册中SPI和触发器章节获取更多信息.
注意
CREATETRIGGER是PostgreSQL语言扩展.
只有表所有者可以就此表创建一个触发器.
在当前的版本,STATEMENT触发器还没有实现.
请参考DROPTRIGGER获取如何删除触发器的信息.
用法
在插入或更新表films之前检查一下声明的分销商代码是否存在于distributors表中:
CREATETRIGGERif_dist_exists
BEFOREINSERTORUPDATEONfilmsFOREACHROW
EXECUTEPROCEDUREcheck_primary_key('did','distributors','did');

在删除或更新一个分销商的内容之前,将所有记录移到表films中:
CREATETRIGGERif_film_exists
BEFOREDELETEORUPDATEONdistributorsFOREACHROW
EXECUTEPROCEDUREcheck_foreign_key(1,'CASCADE','did','films','did');
兼容性SQL92
在里没有CREATETRIGGER语句.
上面第二个例子可以使用一个FOREIGNKEY约束实现:
CREATETABLEdistributors(
didDECIMAL(3),
nameVARCHAR(40),
CONSTRAINTif_film_exists
FOREIGNKEY(did)REFERENCESfilms
ONUPDATECASCADEONDELETECASCADE
);

CREATETYPE
CREATETYPE
Name
CREATETYPE--定义一个新的数据类型
Synopsis
CREATETYPEtypename(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
一个函数的名称,由CREATEFUNCTION创建,将数据从外部类型转换成内部类型.
output_function
一个函数的名称,由CREATEFUNCTION创建,将数据从内部格式转换成适于显示的形式.
element
被创建的类型是数组;这个声明数组元素的类型.
delimiter
将用做数组的数据元素之间分隔符的字符.
default
该类型的缺省值.通常是省略它的,所以缺省是NULL.
send_function
CREATEFUNCTION创建的函数名,它将该类型的数据转换成一个适合传输到其他机器的形式.
receive_function
CREATEFUNCTION创建的函数名,将该类型从适于传输给其他机器的形式转换为内部形式.
alignment
该数据类型的存储对齐要求.如果声明了,必须是'char','int2','int4'或'double';缺省是'int4'.
storage
该数据类型的存储技术.如果声明了,必须是'plain','external','extended',或'main';缺省是'plain'.
输出
CREATE
如果创建类型成功,返回此信息.
描述
CREATETYPE允许用户在PostgreSQL当前数据库里创建一个新的用户数据类型.定义该类型的用户成为其所有者.typename是新类型的名称而且必须在所定义的数据库中唯一.
CREATETYPE需要在定义类型之前先注册两个函数(用CREATEFUNCTION命令).新的基本类型的形式由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数据类型,并且将这种类型用于一个表定义:
CREATETYPEbox(INTERNALLENGTH=16,
INPUT=my_procedure_1,OUTPUT=my_procedure_2);
CREATETABLEmyboxes(idINT4,descriptionbox);

如果box的内部结构是一个四个float4的数组,我们可以说
CREATETYPEbox(INTERNALLENGTH=16,
INPUT=my_procedure_1,OUTPUT=my_procedure_2,
ELEMENT=float4);
它允许一个box的数值成分float可以用脚标关联.否则该类型和前面的行为一样.
这条命令创建一个大对象类型并将其用于一个表定义:
CREATETYPEbigobj(INPUT=lo_filein,OUTPUT=lo_fileout,
INTERNALLENGTH=VARIABLE);
CREATETABLEbig_objs(idint4,objbigobj);

兼容性SQL92
CREATETYPE命令是PostgreSQL扩展.在SQL99里有一个CREATETYPE语句,但是细节上和PostgreSQL的有比较大区别.
又见
CREATEFUNCTION,DROPTYPE,PostgreSQL程序员手册

CREATEUSER
Name
CREATEUSER--创建一个新的数据库用户帐户
Synopsis
CREATEUSERusername[[WITH]option[...]]
这里option可以是∶

SYSIDuid
|[ENCRYPTED|UNENCRYPTED]PASSWORD'password'
|CREATEDB|NOCREATEDB
|CREATEUSER|NOCREATEUSER
|INGROUPgroupname[,...]
|VALIDUNTIL'abstime'
输入
username
用户名
uid
SYSID子句可以用于选择正在被创建的用户的PostgreSQL用户标识。这个用户标识不需要和UNIX系统用户标识匹配,但是有些人愿意让两者相同。
如果没有声明这个,缺省使用已分配的最高用户标识加一。
[encrypted|unencrypted]password
设置用户的口令,如果你不准备使用口令认证,那么你可以省略这个选项,否则该用户将不能联接到一个口令认证的服务器上。
ENCRYPTED/UNENCRYPTED控制口令在数据库中是否以加密形式存储.使用加密口令存储的时候老的客户端可能有通讯问题.
参阅管理员手册中关于客户端认证的部分获取关于如何设置认证机制的详细信息。
CREATEDB
NOCREATEDB
这个子句定义用户的创建数据库权限.如果声明了CREATEDB,被定义的用户将允许创建其自己的数据库.而使用NOCREATEDB将否决该用户的创建数据库的能力.如果忽略本子句,缺省是NOCREATEDB.
CREATEUSER
NOCREATEUSER
该子句决定一个用户是否能创建一个新的用户.这个选项同样把次用户变成数据库超级用户,可以跨越所有访问限制。省略这个参数将置用户的这个属性为NOCREATEUSER.
groupname
一个组名称,把这个用户设为该组成员。你可以列出多个组名字.
abstime
VALIDUNTIL(有效期)子句设置一个绝对时间,过了该时间后用户的PostgreSQL登陆将不再有效.如果省略这个子句,登陆将总是有效的.
输出
CREATEUSER
如果命令成功完成,返回此信息.
描述
CREATEUSER将向一个PostgreSQL实例增加一个新用户.参考管理员手册获取关于管理用户和认证的信息。要执行这条命令,你必须是一个数据库超级用户。
使用ALTERUSER修改用户的口令和权限,DROPUSER删除一个用户。使用ALTERGROUP从组中增加或删除用户。PostgreSQL里有一个脚本createuser与此命令相同的功能(实际上,它调用这条命令),但是可以在命令行上运行。
用法
创建一个没有口令的用户:
CREATEUSERjonathan
创建一个有口令的用户:
CREATEUSERdavideWITHPASSWORD'jw8s0F4'
创建一个有口令的用户,其帐号在2001年底失效.注意当2002年走过一秒后,该帐号将不再有效:
CREATEUSERmiriamWITHPASSWORD'jw8s0F4'VALIDUNTIL'Jan12002'
创建一个拥有创建数据库权限的用户:
CREATEUSERmanuelWITHPASSWORD'jw8s0F4'CREATEDB
兼容性SQL92
在里没有CREATEUSER语句.

CREATEVIEW
Name
CREATEVIEW--定义一个视图
Synopsis
CREATEVIEWviewASSELECTquery
输入
view
所要创建的视图名称.
query
一个将为视图提供行和列的SQL查询.
请参阅SELECT语句获取有效参数的更多信息.
输出
CREATE
如果视图创建成功,返回此信息.
ERROR:Relation'view'alreadyexists
如果在数据库中已经存在所声明的视图.
NOTICE:Attribute'column'hasanunknowntype
如果不声明,所创建的视图将有一个未知类型的字段.例如,下面命令返回一个警告:
CREATEVIEWvistaASSELECT'HelloWorld'

然而下面命令将不出现警告:
CREATEVIEWvistaASSELECTtext'HelloWorld'

描述
CREATEVIEW将定义一个表的视图.这个视图不是物理上实际存在(于磁盘)的.具体的说,自动生成一个改写索引规则的查询用以支持在视图上的检索.
注意
目前,视图是只读的∶系统将不允许在视图上插入,更新,或者删除数据.你可以通过在视图上创建把插入等动作重写为向其它表做合适操作的规则来实现可更新视图的效果.更多信息详见CREATERULE.
使用DROPVIEW语句删除视图.
用法
创建一个由所有Comedy(喜剧)电影组成的视图:
CREATEVIEWkindsAS
SELECT*
FROMfilms
WHEREkind='Comedy';
SELECT*FROMkinds;

code|title|did|date_prod|kind|len
-------+---------------------------+-----+------------+--------+-------
UA502|Bananas|105|1971-07-13|Comedy|01:22
C_701|There'saGirlinmySoup|107|1970-06-11|Comedy|01:36
(2rows)
兼容性SQL92
CREATEVIEW声明了一些附加的功能:
CREATEVIEWview[column[,...]]
ASSELECTexpression[AScolname][,...]
FROMtable[WHEREcondition]
[WITH[CASCADE|LOCAL]CHECKOPTION]
完整的命令可选的子句是:
CHECKOPTION
这个选项用于可更新视图.所有对视图的INSERT和UPDATE都要经过视图定义条件的校验.如果没有通过校验,更新将被拒绝.
LOCAL
对这个视图进行完整性检查.
CASCADE
对此视图和任何相关视图进行完整性检查.在既没有声明CASCADE也没有声明LOCAL时,假设为CASCADE.

DECLARE
DECLARE
Name
DECLARE--定义一个游标
Synopsis
DECLAREcursorname[BINARY][INSENSITIVE][SCROLL]
CURSORFORquery
[FOR{READONLY|UPDATE[OFcolumn[,...]]]
输入
cursorname
将在随后FETCH操作中使用的游标名.
BINARY
令游标以二进制而不是文本格式获取数据.
INSENSITIVE
关键字,表明从游标检索出来的数据不应该被其他进程或游标的更新动作影响.因为在PostgreSQL里,游标的操作总是发生在事务里,所以总是符合上面描述.这个关键字没有作用.
SCROLL
关键字,表明每个FETCH操作可以检索出多行数据.因为在PostgreSQL在任何情况下都允许这样,所以这个关键字没有作用.
query
一个SQL查询,它提供由游标控制的行.请参考SELECT语句获取有关有效参数的详细信息.
READONLY
关键字,表明游标将用于只读模式.因为这是PostgreSQL唯一的游标访问模式,所以该关键字没有作用.
UPDATE
关键字,表明游标将被用于更新表.因为游标更新目前还不被PostgreSQL支持,所以这个关键字将产生一个错误信息.
column
将被更新的列.因为游标更新目前不被PostgreSQL支持,所以UPDATE子句将产生一个错误信息.
输出
SELECT
如果SELECT成功运行,返回此信息.
NOTICE:Closingpre-existingportal"cursorname"
如果在当前的事务块中此游标名称已经定义,返回此信息.前面定义的游标被丢弃.
ERROR:DECLARECURSORmayonlybeusedinbegin/endtransactionblocks
如果一个游标没有在事务块内部定义,返回此信息.
描述
DECLARE允许用户创建游标,用于在一个大的查询里面检索少数几行数据.使用FETCH,游标可以既可以返回文本也可以返回二进制格式。.
通常游标返回文本格式,要么是ASCII要么是某种由PostgreSQL特定的后端决定的编码方式.因为数据在系统内部是用二进制格式存储的,系统必须对数据做一定转换以生成文本格式.另外,文本格式一般都比对应的二进制格式占的存储空间大.一旦格式转换回文本,客户应用需要将文本转换为二进制格式来操作.BINARY游标给你返回内部二进制形态的数据。
作为例子,如果查询从一个整数列返回一个一,在通常的游标里你将获得一个字符串'1'而如果是一个二进制查询,你将得到一个4-字节的等于ctrl-A('^A')的数值.
游标应该小心使用BINARY.一些用户应用如psql是不识别二进制游标的,而且期望返回的数据是文本格式.
而且,字符串表示方式是与硬件体系无关的,而二进制格式会因不同的硬件体系不同而不同,而且PostgreSQL对二进制游标不做字节序解析或者其他格式转换。因此,如果你的客户机和服务器使用不同的格式(如:"高位高字节"和"底位底字节").你可能就不会希望你的数据以二进制格式返回.所以二进制游标将比文本略微快一点,因为二进制在服务器和客户端的数据传输中有较少的转换.
小技巧:如果你希望用ASCII显示数据,将数据以ASCII模式访问将节省客户端的工作.
注意
游标只能在事务中使用.使用BEGIN,COMMIT和ROLLBACK定义一个事务块。
在中游标只能在嵌入SQL(ESQL)的应用中使用.PostgreSQL后端没有一个明确的OPENcursor语句;一个游标被认为在定义时就已经打开了.不过,PostgreSQL嵌入的SQL预编译器,ecpg,支持习惯,包括那些和DECLARE和OPEN相关的语句.
用法
定义一个游标:
DECLAREliahonaCURSOR
FORSELECT*FROMfilms;
兼容性SQL92
只允许在嵌入的SQL中和模块中使用游标.PostgreSQL允许交互地使用游标.允许嵌入或模块的游标更新数据库信息.所有PostgreSQL的游标都是只读的.BINARY关键字是PostgreSQL扩展.

DELETE
DELETE
Name
DELETE--删除一个表中的行
Synopsis
DELETEFROM[ONLY]table[WHEREcondition]

输入
table
一个现存表的名字
condition
这是一个SQL选择查询,它返回要被删除的行.
请参考SELECT语句获取关于WHERE子句的更多信息.
输出
DELETEcount
如果行被成功的删除返回此信息.count是要被删除的行数.
如果count为0,没有行被删除.
描述
DELETE从指明的表里删除满足WHEREcondition(条件)的行.
如果condition(WHERE子句)不存在,效果是删除表中所有行.结果是一个有效的空表.
小技巧:TRUNCATE是一个PostgreSQL扩展,它提供一个更快的从表中删除所有行的机制。
缺省时DELETE将删除所声明的表和所有它的子表的记录.如果你希望只更新提到的表,你应该使用OLNY子句.
要对表进行修改,你必须有写权限,同样也必须有读表的权限,这样才能对符合condition(条件)的值进行读取操作.
用法
删除所有电影(films)但不删除音乐(musicals):
DELETEFROMfilmsWHEREkind<>'Musical';
SELECT*FROMfilms;

code|title|did|date_prod|kind|len
-------+---------------------------+-----+------------+---------+-------
UA501|WestSideStory|105|1961-01-03|Musical|02:32
TC901|TheKingandI|109|1956-08-11|Musical|02:13
WD101|BedKnobsandBroomsticks|111||Musical|01:57
(3rows)
清空表films:
DELETEFROMfilms;
SELECT*FROMfilms;

code|title|did|date_prod|kind|len
------+-------+-----+-----------+------+-----
(0rows)
兼容性SQL92
允许定位的DELETE(删除)语句:
DELETEFROMtableWHERE
CURRENTOFcursor
这里cursor表示一个打开的游标.PostgreSQL里交互式游标是只读的.

DROPAGGREGATE
DROPAGGREGATE
Name
DROPAGGREGATE--删除一个用户定义的聚集函数
Synopsis
DROPAGGREGATEnametype
输入
name
现存的聚集函数名。
type
现存的聚集函数的输入数据类型,或者*--如果这个聚集函数接受任意输入类型.(请参考PostgreSQL用户手册获取关于数据类型的更多信息)。
输出
DROP
命令成功的返回信息.
ERROR:RemoveAggregate:aggregate'name'fortypetypedoesnotexist
如果声明的函数在数据库中不存在,返回此信息.
描述
DROPAGGREGATE将删除对一个现存聚集函数的所有索引.执行这条命令的用户必须是该聚集函数的所有者.
注意
使用CREATEAGGREGATE语句创建一个聚集函数。
用法
将类型int4的聚集函数myavg删除:
DROPAGGREGATEmyavg(int4);
兼容性SQL92
在中没有DROPAGGREGATE语句.该语句是一个PostgreSQL语言的扩展.

DROPDATABASE
Name
DROPDATABASE--删除一个数据库.
Synopsis
DROPDATABASEname
输入
name
要被删除的现有数据库名.
输出
DROPDATABASE
如果命令成功执行,返回此命令.
DROPDATABASE:cannotbeexecutedonthecurrentlyopendatabase
你不能和准备删除的数据库建立联接.你需要和template1或者任何其它的数据库相连来运行这些命令.
DROPDATABASE:cannotbeexecutedonthecurrentlyopendatabase
执行这条命令之前你必须先结束正在处理的事务。
描述
DROPDATABASE删除一个现存数据库的目录入口并且删除包含数据的目录.只有数据库所有者能够执行这条命令(通常也是数据库创建者).
DROPDATABASE不能撤销,小心使用.
注意
这条命令在和目标数据库联接时不能执行.通常更好的做法是用dropdb脚本代替,该脚本是此命令的一个封装。,
请参考CREATEDATABASE语句获取如何创建数据库的信息.
兼容性SQL92

DROPDATABASE是一个PostgreSQL语言的扩展.在中没有这条命令.

DROPFUNCTION
Name
DROPFUNCTION--删除一个用户定义的函数
Synopsis
DROPFUNCTIONname([type[,...]])
输入
name
现存的函数名称.
type
函数参数的类型.
输出
DROP
命令成功执行的返回信息.
NOTICERemoveFunction:Function"name"("types")doesnotexist
如果当前数据库里不存在所声明的函数,返回此信息.
描述
DROPFUNCTION将删除一个现存的函数的引用.要执行这条命令,用户必须是函数的所有者.必须声明函数的输入参数类型,因为几个不同的函数可能会有同样的名字和不同的参数列表.
注意
请参考CREATEFUNCTION获取创建聚集函数的信息.
对依赖于该函数的类型,操作符访问方式或者触发器是否事先被删除不做任何校验.
用法
这条命令删除平方根函数:
DROPFUNCTIONsqrt(int4);
兼容性SQL92
DROPFUNCTION是PostgreSQL语言的扩展.
SQL/PSM
SQL/PSM是一个为实现函数扩展能力而提出的标准.SQL/PSMDROPFUNCTION语句有下面的语法:
DROP[SPECIFIC]FUNCTIONname{RESTRICT|CASCADE}

DROPGROUP
DROPGROUP
Name
DROPGROUP--删除一个用户组
Synopsis
DROPGROUPname

输入
name
现存组名。
输出
DROPGROUP
成功删除组后返回的信息。
描述
DROPGROUP从数据库中删除指定的组。组中的用户不被删除。组中的用户不被删除。
使用CREATEGROUP增加新组,用ALTERGROUP修改组的成员。
用法
删除一个组:
DROPGROUPstaff;
兼容性SQL92

里没有DROPGROUP

DROPINDEX
Name
DROPINDEX--删除一个索引
Synopsis
DROPINDEXindex_name[,...]
输入
index_name
要删除的索引名.
输出
DROP
如果索引成功删除返回的信息.
ERROR:index"index_name"doesnotexist
如果index_name不是这个数据库的索引,返回此信息.
描述
DROPINDEX从数据库中删除一个现存的索引.要执行这个命令,你必须是索引的所有者.theindex.
注意
DROPINDEX是PostgreSQL语言扩展.
请参考CREATEINDEX语句获取如何创建索引的信息.
用法
此命令将删除title_idx索引:
DROPINDEXtitle_idx;
兼容性SQL92
定义用于访问纯关系型数据库的命令.索引是一个与具体实现相关的特性,因而没有与具体实现相关的特性或定义在语言里面.

DROPLANGUAGE
DROPLANGUAGE
Name
DROPLANGUAGE--删除一个用户定义的过程语言
Synopsis
DROP[PROCEDURAL]LANGUAGE'name'

输入
name
现存语言的名称.
输出
DROP
如果语言成功删除,返回此信息.
ERROR:Language"name"doesn'texist
如果语言name没有找到,返回此信息.
描述
DROPPROCEDURALLANGUAGE将删除曾注册过的过程语言name.
注意
DROPPROCEDURALLANGUAGE语句是PostgreSQL语言的扩展.
请参考CREATELANGUAGE获取如何创建过程语言的信息.
将不会校验用这种语言注册的函数或触发器是否仍然存在.要想重新使用这些东西而不用删除和重新创建所有这些函数,函数pg_proc的prolang字段/属性必须调整为为PL重新创建的pg_language入口的新对象标识(OID).
用法
下面命令删除PL/Sample语言:
DROPPROCEDURALLANGUAGE'plsample';
兼容性SQL92
在里没有DROPPROCEDURALLANGUAGE

DROPOPERATOR
DROPOPERATOR
Name
DROPOPERATOR--删除一个用户定义操作符
Synopsis
DROPOPERATORid(lefttype|NONE,righttype|NONE)
输入
id
一个现存的操作符的标识符.
lefttype
该操作符左参数的类型.如果该操作符没有左参数,写NONE.
righttype
该操作符右参数的类型.如果该操作符没有右参数,写NONE.
输出
DROP
命令成功执行的返回函数.
ERROR:RemoveOperator:binaryoperator'oper'taking'lefttype'and'righttype'doesnotexist
如果声明的双目操作符不存在,返回此信息.
ERROR:RemoveOperator:leftunaryoperator'oper'taking'lefttype'doesnotexist
如果声明的左目操作符不存在,返回此信息.
ERROR:RemoveOperator:rightunaryoperator'oper'taking'righttype'doesnotexist
如果声明的右目操作符不存在,返回此信息.
描述
DROPOPERATOR语句从数据库中删除一个现存的操作符.要执行这个命令,你必须是操作符所有者.
左目操作符的右类型或右目操作符的左类型可以声明为NONE.
注意
DROPOPERATOR语句是PostgreSQL语言扩展.
请参考CREATEOPERATOR获取如何创建操作符的信息.
删除任何依赖于被删除的操作符的访问模式和操作符表是用户的责任.
用法
将用于int4的幂操作符a^n删除:
DROPOPERATOR^(int4,int4);
删除用于boolean变量的左目取反操作符(!b):
DROPOPERATOR!(none,bool);
删除用于int4的阶乘(!i):int4:
DROPOPERATOR!(int4,none);
兼容性SQL92
在里没有DROPOPERATOR语句.

DROPRULE
DROPRULE
Name
DROPRULE--删除一个重写规则
Synopsis
DROPRULEname[,...]
输入
name
要删除的现存的规则.
输出
DROP
删除成功返回的信息.
ERROR:Ruleorview"name"notfound
如果声明的规则不存在,返回此信息.
描述
DROPRULE从声明的PostgreSQL规则系统里删除一个规则.PostgreSQL将立即停止使用之并且将会把它从系统表中清理出去.
注意
DROPRULE语句是PostgreSQL语言的扩展.
请参考CREATERULE获取如何创建规则的信息.
一旦一个规则被删除掉,该规则所写的历史记录信息将可能不存在.
用法
删除重写规则newrule:
DROPRULEnewrule;
兼容性SQL92
在中没有DROPRULE

DROPSEQUENCE
DROPSEQUENCE
Name
DROPSEQUENCE--删除一个序列
Synopsis
DROPSEQUENCEname[,...]
输入
name
序列名.
输出
DROP
序列成功删除后返回的信息.
ERROR:sequence"name"doesnotexist
如果声明的序列不存在,返回此信息.
描述
DROPSEQUENCE从数据库中删除序列号生成器.因为目前的序列实现是作为一个特殊的表,所以此语句就象DROPTABLE语句一样.
注意
DROPSEQUENCE语句是Postgres语言扩展.
请参考CREATESEQUENCE语句获取如何创建一个序列的信息.
用法
从数据库中删除序列serial:
DROPSEQUENCEserial;
兼容性SQL92
在里没有DROPSEQUENCE

DROPTABLE
DROPTABLE
Name
DROPTABLE--删除一个表
Synopsis
DROPTABLEname[,...]

输入
name
要删除的现存表或视图.
输出
DROP
如果命令成功完成,返回此信息.
ERROR:table"name"doesnotexist
果声明的表或视图在数据库中不存在.
描述
DROPTABLE从数据库中删除表或视图.只有其所有者才能删除一个表或视图.使用DELETE一个表可能没有任何行,但不会被删除.
如果被删除的表有从索引,它们将首先被删除.从索引的删除将对所属表的内容没有任何影响.
注意
请参考CREATETABLEALTERTABLE获取如何创建或更改表的信息.
用法
删除films和distributors表:
DROPTABLEfilms,distributors;
兼容性SQL92
为DROPTABLE声明了一些附加的功能:
DROPTABLEtable{RESTRICT|CASCADE}

RESTRICT
确保只有不存在相关视图或完整性约束的表才可以被删除.
CASCADE
任何引用的视图或完整性约束都将被删除.
小技巧:目前,要删除一个视图,你必须明确删除之.

DROPTRIGGER
DROPTRIGGER
Name
DROPTRIGGER--删除一个触发器定义.
Synopsis
DROPTRIGGERnameONtable

输入
name
现存的触发器名.
table
表的名称.
输出
DROP
如果触发器成功的删除,返回此信息.
ERROR:DropTrigger:thereisnotriggernameonrelation"table"
如果声明的触发器不存在,返回此信息.
描述
DROPTRIGGER将删除所有对一个现存触发器的引用.要执行这个命令,当前用户必须是触发器的所有者.
注意
DROPTRIGGER是PostgreSQL语言的扩展.
请参考CREATETRIGGER获取如何创建触发器的信息.
用法
删除表films的if_dist_exists触发器:
DROPTRIGGERif_dist_existsONfilms;
兼容性SQL92
在里没有DROPTRIGGER

DROPTYPE
DROPTYPE
Name
DROPTYPE--删除一个用户定义数据类型
Synopsis
DROPTYPEtypename[,...]
输入
typename
现存的类型名.
输出
DROP
命令执行成功的返回信息.
ERROR:RemoveType:type'typename'doesnotexist
如果声明的类型没有找到,返回此信息.
描述
DROPTYPE将从系统表里删除用户的类型.
只有类型所有者可以删除类型.
注意
DROPTYPE语句是PostgreSQL语言的扩展.
请参考CREATETYPE获取如何创建类型的信息.
用户有责任删除任何使用了被删除类型的操作符,函数,聚集,访问模式,子类型和表.不过,相关等数组数据类型(由CREATETYPE自动创建)将自动删除.
如果删除了一个内建的类型,后端的行为将不可预测.
用法
删除box类型:
DROPTYPEbox;
兼容性SQL92
SQL3
DROPTYPE是SQL3语句.

DROPUSER
DROPUSER
Name
DROPUSER--删除一个数据库用户帐号
Synopsis
DROPUSERname
输入
name
一个现存用户的名称.
输出
DROPUSER
用户被成功删除的返回信息.
ERROR:DROPUSER:user"name"doesnotexist
如果用户名没有找到,返回此信息.
DROPUSER:user"name"ownsdatabase"name",cannotberemoved
你必须先删除数据库或者改变其所有者。
描述
DROPUSER从数据库中删除指定的用户。它不删除数据库里此用户所有的表,视图或其他对象。如果该用户拥有任何数据库,你会收到一个错误信息。
使用CREATEUSER增加新用户,用ALTERUSER修改用户属性。PostgreSQL还有一个脚本dropuser,这个脚本和这条命令功能相同(实际上,脚本里调用此命令),但是可以在命令行上运行。
用法
删除一个用户帐户:
DROPUSERjonathan;
兼容性SQL92
在里没有DROPUSER

DROPVIEW
DROPVIEW
Name
DROPVIEW--删除一个视图
Synopsis
DROPVIEWname[,...]

输入
name
现存视图名称.
输出
DROP
命令成功执行的返回.
ERROR:viewnamedoesnotexist
如果声明的视图在数据库中不存在,返回此信息.
描述
DROPVIEW从数据库中删除一个现存的视图.执行这条命令必须是视图的所有者.
注意
请参考CREATEVIEW获取关于如何创建视图的信息.
用法
下面命令将删除视图kinds:
DROPVIEWkinds;

兼容性SQL92
DROPVIEW声明了一些附加的功能:
DROPVIEWview{RESTRICT|CASCADE}

输入
RESTRICT
确保只有不存在关联视图或完整性约束的视图可以被删除.
CASCADE
任何引用的视图和完整性约束都将被删除.
注意
目前,要从PostgreSQL数据库中删除一个视图,你必须明确地将其删除.

END
Name
END--提交当前的事务
Synopsis
END[WORK|TRANSACTION]
输入
WORK
TRANSACTION
可选关键字。没有作用。
输出
COMMIT
事务成功提交后的返回信息。
NOTICE:COMMIT:notransactioninprogress
如果没有正在处理的事务,返回此信息。
描述
END是PostgreSQL而-兼容的同义语句是COMMIT.
注意
关键字WORK和TRANSACTION是多余的,可以省略。
使用ROLLBACK退出一个事务。
用法
令所有改变生效:
ENDWORK;
兼容性SQL92
END是PostgreSQL的扩展,提供与COMMIT相同的功能。

EXPLAIN
EXPLAIN
Name
EXPLAIN--显示语句执行规划
Synopsis
EXPLAIN[VERBOSE]query
输入
VERBOSE
显示详细查询规划的标志.
query
任何query(查询).
输出
NOTICE:QUERYPLAN:plan
PostgreSQL后端明确的查询规划.
EXPLAIN
查询规划显示后发送的标志.
描述
这条命令显示PostgreSQL规划器为所提供的查询生成的执行规划。执行规划显示查询引用的表是如何被扫描的---是简单的顺序扫描,还是索引扫描等---并且如果引用了多个表,采用了什么样的连接算法从每个输入的表中取出所需要的记录。
显示出来的最关键的部分是预计的查询执行开销,这就是规划器对运行该查询所需时间的估计(以磁盘页面存取为单位计量)。实际上显示了两个数字:返回第一条记录前的启动时间,和返回所有记录的总时间。对于大多数查询而言,关心的是总时间,但是,在某些环境下,比如一个EXISTS子查询里,规划器将选择最小启动时间而不是最小总时间(因为执行器在获取一条记录后总是要停下来)。同样,如果你用一条LIMIT子句限制返回的记录数,规划器会在最终的开销上做一个合理的插值以计算哪个规划开销最省。
VERBOSE选项输出规划树在系统内部的完整内容,而不仅仅是一个概要(并且还把它发送给postmaster日志文件)。通常这个选项只是对调试PostgreSQL有用。
注意
在PostgreSQL中只有很少的关于使用优化器的开销的文档.通常的关于查询优化的开销的估算可以在数据库的手册中找到.请参考程序员手册中关于索引和基因查询优化器的章节获取更多信息.
用法
显示一个对只有一个int4列和128行的表的简单查询的查询规划:
EXPLAINSELECT*FROMfoo;
NOTICE:QUERYPLAN:
SeqScanonfoo(cost=0.00..2.28rows=128width=4)
EXPLAIN
对同一个拥有支持查询equijoin条件的索引的表,EXPLAIN将显示一个不同的规划:
EXPLAINSELECT*FROMfooWHEREi=4;
NOTICE:QUERYPLAN:
IndexScanusingfionfoo(cost=0.00..0.42rows=1width=4)
EXPLAIN
最后,同一个拥有支持查询equijoin条件的索引的表,EXPLAIN对使用一个聚集函数的查询将显示下面内容:
EXPLAINSELECTsum(i)FROMfooWHEREi=4;
NOTICE:QUERYPLAN:

Aggregate(cost=0.42..0.42rows=1width=4)
->IndexScanusingfionfoo(cost=0.00..0.42rows=1width=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"notfound
如果cursor在前面没有定义,返回此信息.游标必须在一个事务块中定义.
NOTICE:FETCH/ABSOLUTEnotsupported,usingRELATIVE
PostgreSQL不支持游标的绝对定位.
ERROR:FETCH/RELATIVEatcurrentpositionisnotsupported
允许我们用下面语句在"当前位置"不停地检索游标
FETCHRELATIVE0FROMcursor.

PostgreSQL目前不支持这种用法;实际上,零被保留用于检索所有行,等效于声明ALL关键字.如果使用RELATIVE关键字,PostgreSQL假设用户试图使用的特性,因而返回此错误.
描述
FETCH允许用户使用游标检索行.所要检索的行数用#声明.如果游标中剩下的行小于#,那么只有那些可用的抓过来.用关键字ALL代替数字将导致游标中所有剩余行被抓过来.记录可以FORWARD(向前)抓,也可以BACKWARD(向后)抓.缺省的方向是FORWARD(向前).
注意:可以用负数作为行记数,符号等效于颠倒抓取方向关键字(FORWARD和BACKWARD).例如,FORWARD-1等效于BACKWARD1
注意
注意FORWARD和BACKWARD关键字是PostgreSQL扩展.语法也支持,在此命令的第二种形式中声明.详细的兼容性SQL92信息见下面.
在游标中更新数据还不被PostgreSQL,支持,因为将游标更新影射回基本表是不太可能的,这一点对VIEW更新也一样.因而用户必须显式的使用UPDATE命令来更新数据.
游标只能用于事务内部,因为它们存储的数据跨越了多个用户的查询.
使用MOVE语句改变游标位置.使用DECLARE语句定义一个游标.使用BEGIN,COMMIT,和ROLLBACK语句获取更多关于事务的信息.
用法
下面的例子用一个游标跨过一个表。
--建立一个游标:

BEGINWORK;
DECLAREliahonaCURSORFORSELECT*FROMfilms;

--抓取头5行到游标liahona里:
FETCHFORWARD5INliahona;

code|title|did|date_prod|kind|len
-------+-------------------------+-----+------------+----------+-------
BL101|TheThirdMan|101|1949-12-23|Drama|01:44
BL102|TheAfricanQueen|101|1951-08-11|Romantic|01:43
JL201|UneFemmeestuneFemme|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

--抓取前面行:
FETCHBACKWARD1INliahona;

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

--关闭游标并提交事务:

CLOSEliahona;
COMMITWORK;
兼容性SQL92

注意:非嵌入式游标的使用是PostgreSQL扩展.游标的语法和用途与定义与里定义的嵌入式用法相似。
允许游标在FETCH中的绝对定位,并且允许将结果放在明确的变量里:
FETCHABSOLUTE#
FROMcursor
INTO:variable[,...]

ABSOLUTE
游标将放置在写明的绝对的行数的位置上.在PostgreSQL中所有的行数都是相对数量,所以这一功能不支持.
:variable
目标宿主变量.

GRANT
Name
GRANT--定义访问权限
Synopsis
GRANT{{SELECT|INSERT|UPDATE|DELETE|RULE|REFERENCES|TRIGGER}[,...]|ALL[PRIVILEGES]}
ON[TABLE]objectname[,...]TO{username|GROUPgroupname|PUBLIC}[,...]
描述
GRANT命令将某对象(表,视图,序列)上的特定权限给予一个用户或者多个用户或者一组用户.这些权限将增加到那些已经赋予的权限上,如果存在这些权限的话.
键字PUBLIC表示该权限要赋予所有用户,包括那些以后可能创建的用户.PUBLIC可以看做是一个隐含定义好的组,它总是包括所有用户.请注意,任何特定的用户都将拥有直接赋予他/她的权限,加上他/她所处的任何组,以及再加上赋予PUBLIC的权限的总和.
在创建完对象之后,除了对象的创建者之外,其它用户没有任何访问该对象的权限,除非创建者赋予某些权限.对对象的创建者而言,没有什么权限需要赋予,因为创建者自动持有所有权限.(不过,创建者出于安全考虑可以选择废弃一些他自己的权限.请注意赋予和废止权限的能力是创建者与生具来的,并且不会丢失.删除对象的权利也是创建者固有的,并且不能赋予或撤销.)
可能的权限有∶
SELECT
允许对声明的表,试图,或者序列SELECT仁义字段.还允许做COPY的源.
INSERT
允许向声明的表INSERT一个新行.同时还允许做COPY的目标.
UPDATE
允许对声明的表中任意字段做UPDATE.SELECT...FORUPDATE也要求这个权限(除了SELECT权限之外).比如,这个权限允许使用nextval,currval和setval.
DELETE
允许从声明的表中DELETE行.
RULE
允许在该表/视图上创建规则.(参阅CREATERULE语句.)
REFERENCES
要在一个表上创建一个外键约束,你必须在带参考健字的表上拥有这个权限.
TRIGGER
允许在声明表上创建触发器.(参阅CREATETRIGGER语句.)
ALLPRIVILEGES
把上面所有权限都一次赋予.PRIVILEGES关键字在PostgreSQL里是可选的,但是严格的SQL要求有这个关键字.
其它命令要求的权限都在相应的命令的参考页上列出.
注意
我们要注意数据库superusers可以访问所有对象,而不会受对象的权限设置影响.这个特点类似Unix系统的root的权限.和root一样,除了必要的情况,总是以超级用户身分进行操作是不明智的做法.
目前,要在PostgreSQL里只对某几列赋予权限,你必须创建一个拥有那几行的视图然后给那个视图赋予权限.
使用psql的\z命令获取在现有对象上的与权限有关的信息.
Database=lusitania
+------------------+---------------------------------------------+
|Relation|Grant/RevokePermissions|
+------------------+---------------------------------------------+
|mytable|{"=rw","miriam=arwdRxt","grouptodos=rw"}|
+------------------+---------------------------------------------+
Legend:
uname=arwR--privilegesgrantedtoauser
groupgname=arwR--privilegesgrantedtoagroup
=arwR--privilegesgrantedtoPUBLIC

r--SELECT("read")
w--UPDATE("write")
a--INSERT("append")
d--DELETE
R--RULE
x--REFERENCES
t--TRIGGER
arwdRxt--ALLPRIVILEGES
REVOKE命令删除访问权限.
例子
把表films的插入权限赋予所有用户∶
GRANTINSERTONfilmsTOPUBLIC;
赋予用户manuel对视图kinds的所有权限∶
GRANTALLPRIVILEGESONkindsTOmanuel;
兼容性SQL92
在ALLPRIVILEGES里的PRIVILEGES关键字是必须的.SQL不支持在一条命令里对多个表设置权限.
的GRANT语法允许在一个表里为独立的字段设置权限,并且允许设置一个权限用来给其它人赋予同样的权限∶
GRANTprivilege[,...]
ONobject[(column[,...])][,...]
TO{PUBLIC|username[,...]
}[WITHGRANTOPTION]
SQL允许对其它类型的对象赋予USAGE权限∶CHARACTERSET,COLLATION,TRANSLATION,DOMAIN.
TRIGGER权限是SQL99引入的.RULE权限是PostgreSQL扩展.
又见
REVOKE

INSERT
Name
INSERT--在表中创建新行
Synopsis
INSERTINTOtable[(column[,...])]
{DEFAULTVALUES|VALUES(expression[,...])|SELECTquery}
输入
table
现存表的名称.
column
表table中的列/字段名.
DEFAULTVALUES
所有字段都会用NULL或者创建表时用DEFAULT子句声明的值填充.
expression
赋予column的一个有效表达式或值.
query
一个有效的查询.请参考SELECT语句获取有效参数的进一步描述.
输出
INSERToid1
如果只插入了一行,返回此信息.oidOID是被插入行的数字标识.
INSERT0#
如果插入了超过一行,返回此信息.#是插入的行数.
描述
INSERT允许我们向表中插入新行.我们可以一次插入一行或多行作为查询结果.目标列表中的列/字段可以按任何顺序排列.
在目标列中没有出现的列/字段将插入缺省值,要么是定义了的DEFAULT值或者NULL。如果向定义为NOTNULL的列中插入NULL值,PostgreSQL将拒绝新列。
如果每行的表达式不是正确的数据类型,将试图进行自动的类型转换.
要想向表中插入数据,你必须有插入权限,同样也要有选择权限用于处理WHERE子句里声明的任何表。
用法
向表films里插入一行:
INSERTINTOfilmsVALUES
('UA502','Bananas',105,'1971-07-13','Comedy',INTERVAL'82minute');
在第二个例子里面省略了字段len因此在它里面将只存储缺省的NULL值:
INSERTINTOfilms(code,title,did,date_prod,kind)
VALUES('T_601','Yojimbo',106,DATE'1961-06-16','Drama');

向表distributors里插入一行;注意只声明了字段name,而没有声明的字段did将被赋于它的缺省值:
INSERTINTOdistributors(name)VALUES('BritishLion');

从表tmp中插入几行到表films中:
INSERTINTOfilmsSELECT*FROMtmp;

插入数组(请参考PostgreSQL用户手册获取关于数组的更多信息):
--创建一个空的3x3游戏板来玩圈-和-叉游戏
--(所有这些查询创建相同的板属性)
INSERTINTOtictactoe(game,board[1:3][1:3])
VALUES(1,'{{"","",""},{},{"",""}}');
INSERTINTOtictactoe(game,board[3][3])
VALUES(2,'{}');
INSERTINTOtictactoe(game,board)
VALUES(3,'{{,,},{,,},{,,}}');

兼容性SQL92
INSERT语句与完全兼容.可能碰到的关于query子句特性的限制在SELECT语句中有相关文档..

LISTEN
Name
LISTEN--监听一个通知
Synopsis
LISTENname

输入
name
通知条件名.
输出
LISTEN
成功完成注册后的返回信息.
NOTICEAsync_Listen:Wearealreadylisteningonname
如果这个后端已经注册了该通知条件.
描述
LISTEN将当前PostgreSQL后端注册为通知条件name.的监听器.
当执行了命令NOTIFYname后,不管是此后端(进程)或者是其他一个联接到同一数据库的后端(进程)执行的,所有正在监听此通知条件的后端(进程)都将收到通知,并且接下来每个后端将通知与其相连的前端应用.请参考NOTIFY获取更多信息.
使用UNLISTEN命令,可以将一个后端内已注册的通知条件删除.同样,后端进程退出时自动删除该后端正在监听的已注册通知条件.
前端应用检测通知事件的方法取决于PostgreSQL应用使用的编程接口.如果使用基本的libpq库,应用将LISTEN当作普通SQL命令使用,而且必须周期地调用PQnotifies过程来检测是否有通知到达.其他像libpgtcl接口提供了更高级的控制通知事件的方法;实际上,使用libpgtcl,应用程序员不应该直接使用LISTENUNLISTEN.请参考你使用的库的文档获取更多细节.
NOTIFY的手册页包含更广泛的关于LISTENNOTIFY的使用的讨论.
注意
name可以是任何可以作为名称有效的字符串;它不需要与任何实际表相对应.如果notifyname被双引号包围,它甚至可以不是一个有效的语句串,而可以是任何小于31字符的字符串.
一些以前的PostgreSQL,如果name不与任何现存的表名对应就必须用双引号括起来.不管语意上是否正确.现在不再有这个限制了.
用法
在psql里配制和执行一个监听/通知序列:
LISTENvirtual;
NOTIFYvirtual;

AsynchronousNOTIFY'virtual'frombackendwithpid'8448'received.
兼容性SQL92

在里没有LISTEN

LOAD
Name
LOAD--装载或重载一个共享库文件
Synopsis
LOAD'filename'

描述
装载一个共享库文件到PostgreSQL后端的地址空间.一旦一个文件被装载,如果该文件前面曾经装载过,那么首先卸载它.这条命令主要用于在一个共享库件修改后卸载和重载它.要利用这个共享库件,我们必须用CREATEFUNCTION命令声明函数.
文件名是和CREATEFUNCTION里描写等共享库的名字相同方法声明的;特别要注意等是我们可以依赖搜索路径和自动附加系统标准共享库扩展名的特点.参阅程序员手册获取更多细节.
兼容性SQL92
LOAD是PostgreSQL扩展.
又见
CREATEFUNCTION,PostgreSQL程序员手册

LOCK
Name
LOCK--明确地锁定一个表
Synopsis
LOCK[TABLE]name
LOCK[TABLE]name[,...]INlockmodeMODE

这里lockmode可以是下列之一∶

ACCESSSHARE|ROWSHARE|ROWEXCLUSIVE|SHAREUPDATEEXCLUSIVE|
SHARE|SHAREROWEXCLUSIVE|EXCLUSIVE|ACCESSEXCLUSIVE

输入
name
要锁定的现存的表.
ACCESSSHAREMODE
注意:这个锁模式对被查询的表自动生效。
这是最小限制的锁模式,只与ACCESSEXCLUSIVE模式冲突。它用于保护被查询的表免于被并行的ALTERTABLEDROPTABLEVACUUMFULL对同一表操作的语句修改。
ROWSHAREMODE
注意:任何SELECT...FORUPDATE语句执行时自动生效。
与EXCLUSIVE和ACCESSEXCLUSIVE锁模式冲突。
ROWEXCLUSIVEMODE
注意:任何UPDATEDELETEINSERT语句执行时自动生效。
与SHARE,SHAREROWEXCLUSIVE,EXCLUSIVE和ACCESSEXCLUSIVE模式冲突。
SHAREUPDATEEXCLUSIVEMODE
Note:VACUUM(没有FULL)自动要求.
和SHAREUPDATEEXCLUSIVE,SHARE,SHAREROWEXCLUSIVE,EXCLUSIVE和ACCESSEXCLUSIVE模式冲突.这个模式保护一个表不被并行的(事务进行)大纲修改和VACUUM.
SHAREMODE
注意:任何CREATEINDEX语句执行时自动附加。共享锁住整个表.
与ROWEXCLUSIVE,SHAREUPDATEEXCLUSIVE,SHAREROWEXCLUSIVE,EXCLUSIVE和ACCESSEXCLUSIVE模式冲突。这个模式防止一个表的并行数据更新。
SHAREROWEXCLUSIVEMODE
注意:这个模式类似EXCLUSIVEMODE,但是允许其他事务的ROWSHARE锁.
与ROWEXCLUSIVE,SHAREUPDATEEXCLUSIVE,SHARE,SHAREROWEXCLUSIVE,EXCLUSIVE和ACCESSEXCLUSIVE模式冲突。
EXCLUSIVEMODE
注意:这个模式同样比SHAREROWEXCLUSIVE更有约束力.它阻塞所有并行的ROWSHARE/SELECT...FORUPDATE查询。
与ROWSHARE,ROWEXCLUSIVE,SHAREUPDATEEXCLUSIVE,SHARE,SHAREROWEXCLUSIVE,EXCLUSIVE和ACCESSEXCLUSIVE模式冲突。这个模式只允许并发的ACCESSSHARE,也就是说只有从表中读取数据可以和一个持有这个锁模式的事务并发执行.
ACCESSEXCLUSIVEMODE
注意:由语句ALTERTABLE,DROPTABLEVACUUMFULL执行时自动生效。这是最严格的约束锁,它保护一个被锁定的表不被任何其他并行的操作更改。
注意:一个不合格的LOCKTABLE同样要求这个锁模式(例如,一条没有显式锁模式选项的命令)。
与所有锁模式冲突.
输出
LOCKTABLE
成功获取锁之后的返回.
ERRORname:Tabledoesnotexist.
如果name不存在,返回此信息.
描述
LOCKTABLE控制一次事务的生命期内对某表的并行访问.PostgreSQL在可能的情况下尽可能使用最小约束的锁模式。LOCKTABLE在你需要时提供更有约束力的锁。
RDBMS锁定使用下面术语:
EXCLUSIVE
一个排它锁禁止其它同类型的锁获得批准.(注意∶ROWEXCLUSIVE模式并不完全遵循这个命名规则,因为它是在表一级共享的;它只是相对于要更新的行而言是排它的.)
SHARE
共享锁允许其它(事务)也持有同类型锁,但是禁止对应的EXCLUSIVE锁获得批准.
ACCESS
锁定表结构.
ROW
锁定独立的行.
例如,假设一个应用在READCOMMITED隔离级别上运行事务,并且它需要保证在表中的数据在事务的运行过程中都存在。要实现这个目的,你可以在查询之前对表使用SHARE锁模式进行锁定。这样将保护数据不被并行修改并且为任何更进一步的对表的读操作提供实际的当前状态的数据,因为SHARE锁模式与任何写操作需要的ROWEXCLUSIVE模式冲突,并且你的LOCKTABLEnameINSHAREMODE语句将等到所有并行的写操作提交或回卷后才执行。因此,一旦你获得该锁,那么就不会存在未提交的写操作.
注意:当运行在SERIALIZABLE隔离级别并且你需要读取真实状态的数据时,你必须在执行任何DML语句之前运行一个LOCKTABLE语句。一个串行事务的数据视图将在其第一个DML语句开始的时候冻结住.
除了上面的要求外,如果一个事务准备修改一个表中的数据,那么应该使用SHAREROWEXCLUSIVE锁模式以避免死锁情况(当两个并行的事务试图以SHARE模式锁住表然后试图更改表中的数据时,两个事务(隐含的)都需要ROWEXCLUSIVE锁模式,而此模式与并行的SHARE锁冲突)。
继续上面的死锁(两个事务彼此等待)问题,你应该遵循两个通用的规则以避免死锁条件:

事务应该以相同的顺序对相同的对象请求锁。

例如,如果一个应用更新行R1然后更新行R2(在同一的事务里),那么第二个应用如果稍后要更新行R1时不应该更新行R2(在同一事务里)。相反,它应该与第一个应用以相同的顺序更新行R1和R2。

事务请求两个互相冲突的锁模式的前提:其中一个锁模式是自冲突的(也就是说,一次只能被一个事务持有)。如果涉及多种锁模式,那么事务应该总是最先请求最严格的锁模式。

这个规则的例子在前面的关于用SHAREROWEXCLUSIVE模式取代SHARE模式的讨论中已经给出了。
注意:PostgreSQL的确检测死锁,并将回卷至少一个等待的事务以解决死锁。
注意
LOCK...INACCESSSHAREMODE需要在目标表上有SELECT权限.所有其它形式的LOCK需要UPDATE和/或DELETE权限.
LOCK只是在一个事务块的内部有用(BEGIN...COMMIT),因为锁在事务结束的时候马上被释放.出现在任意事务块外面的LOCK都自动生成一个自包含的事务,因此该锁在获取之后马上被丢弃.
LOCK只在事务内部使用.
用法
演示在往一个外键表上插入时在有主键的表上使用SHARE的锁:
BEGINWORK;
LOCKTABLEfilmsINSHAREMODE;
SELECTidFROMfilms
WHEREname='StarWars:EpisodeI-ThePhantomMenace';
--如果记录没有返回则回卷
INSERTINTOfilms_user_commentsVALUES
(_id_,'GREAT!Iwaswaitingforitforsolong!');
COMMITWORK;

在执行删除操作时对一个有主键的表进行SHAREROWEXCLUSIVE锁:
BEGINWORK;
LOCKTABLEfilmsINSHAREROWEXCLUSIVEMODE;
DELETEFROMfilms_user_commentsWHEREidIN
(SELECTidFROMfilmsWHERErating<5);
DELETEFROMfilmsWHERErating<5;
COMMITWORK;

兼容性SQL92

在里面没有LOCKTABLE,可以使用SETTRANSACTION来声明当前事务的级别.我们也支持这个,参阅SETTRANSACTION获取详细信息。
除了ACCESSSHARE,ACCESSEXCLUSIVE,和SHAREUPDATEEXCLUSIVE锁模式外,PostgreSQL锁模式和LOCKTABLE语句都与那些在Oracle(TM)里面的兼容。

MOVE
Name
MOVE--把游标放到表中的特定的行
Synopsis
MOVE[direction][count]
{IN|FROM}cursor

描述
MOVE允许用户对游标进行一定行的移动.MOVE的工作类似于FETCH命令,但只是定位光标而不返回行.
请参考FETCH命令获取语法和参数的详细信息.
注意
MOVE是PostgreSQL语言扩展.
请参考FETCH获取有效参数的描述.使用DECLARE定义游标.请参考BEGIN,COMMIT和ROLLBACK语句获取关于事务的详细信息.,
用法
设置和使用一个游标:
BEGINWORK;
DECLAREliahonaCURSORFORSELECT*FROMfilms;
--忽略开头5行:
MOVEFORWARD5INliahona;
MOVE
--抓取游标liahona里的第六行:
FETCH1INliahona;
FETCH

code|title|did|date_prod|kind|len
-------+--------+-----+-----------+--------+-------
P_303|48Hrs|103|1982-10-22|Action|01:37
(1row)
--关闭游标liahona并提交工作:
CLOSEliahona;
COMMITWORK;
兼容性SQL92

里没有MOVE语句.但是,允许我们从一个绝对游标位置FETCH(抓取)行,隐含地将游标移动到正确位置.

NOTIFY
Name
NOTIFY--生成一个通知
Synopsis
NOTIFYname

输入
notifyname
生成信号(通知)的通知条件.
输出
NOTIFY
确认通知命令已经执行了.
Notifyevents
事件发送给在监听的前端;前端是否响应或怎样响应取决于它自身的程序.
描述
NOTIFY命令向当前数据库中所有执行过LISTENnotifyname,正在监听特定通知条件的前端应用发送一个通知事件.
传递给前端的通知事件包括通知条件名和发出通知的后端进程PID.数据库设计者有责任定义用于某个数据库的条件名和每个通知条件的含义.
通常,通知条件名与数据库里的表的名字相同,通知时间实际上意味着"我修改了此数据库,请看一眼有什么新东西".NOTIFYLISTEN命令并不强制这种联系.例如,数据库设计者可以使用几个不同的条件名来标志一个表的几种不同改变.
NOTIFY为访问PostgreSQL数据库的一组进程提供了一种简单的信号形式或IPC(内部进程通讯)机制.更高级的机制可以通过使用数据库中的表从通知者传递数据到被通知者.
NOTIFY用于通知某一特定表修改的动作的发生,一个实用的编程技巧是将NOTIFY放在一个由表更新触发的规则里.用这种方法,通知将在表更新的时候自动触发,而且应用程序员不会碰巧忘记处理它.
NOTIFY和SQL事务用某种重要的方法进行交换.首先,如果NOTIFY在事务内部执行,通知事件直到事务提交才会送出.这么做是有道理的,因为如果事务退出了,我们将希望在它里面的所有命令都没有效果-包括NOTIFY.但如果有人希望通知事件及时发送,这就不太好了.其次,当一个正在监听的后端在一次事务内收到一个通知信号,直到本次事务完成(提交或退出)之前,该通知事件将不被送到与之相连的前端。同样,如果一个通知在事务内部发送出去了,而该事务稍后又退出了,我们就希望通知可以在某种程度上被撤消--但通知一旦发送出去,后端便不能从前端"收回"通知.所以通知时间只是在事务之间传递.这一点就要求使用NOTIFY作为实时信号的应用应该确保他们的事务尽可能短.
NOTIFY在一方面的行为象Unix的信号:如果同一条件名在短时间内发出了多条信号,接收者几次执行NOTIFY可能只回收到一条通知信息.所以依赖于收到的通知条数的方法是很不可靠的.因而,使用NOTIFY唤醒需要关注某事的应用,同时还要使用数据库对象(如序列号)来跟踪事件发生了几次.
前端经常会自己发送与正在监听的通知名一样的NOTIFY.这时它(前端)也和其他正在监听的前端一样收到一个通知事件.这样可能导致一些无用的工作(与应用逻辑有关)--例如,对前端刚写过的表又进行一次读操作以发现是否有更新.在PostgreSQL6.4更新的版本中,我们可以通过检查后端进程的PID(在通知事件中提供)是否与自己的后端的PID一致(从libpq中取得).当他们一样时,说明这是其自身回弹的信息,可以忽略.(不管前面章节是如何讲的,这是一个安全的技巧.PostgreSQL保持自身的通知和其他到来的通知区分开.所以你屏蔽了自己的通知后不会略过外部的通知.)
注意
name可以是作为名称的任何字串;它不需要与任何实际的表的名称对应.如果用双引号将name括起,它甚至可以不是语法上有效的名称,可以是任何小于31字符长的字串.
在以前的PostgreSQL版本,name如果和不和任何现存的表名对应时必须用双引号引起来,即使它在语法上是正确的也这样。现在不需要这样做了。
在PostgreSQL早于6.4的版本,在通知信息送出的后端PID总是前端自己的后端的PID.所以在那些早期版本里,不可能将自身的通知信息和别的客户端的通知信息区分开.
用法
在psql里配置和执行一个监听/通知对:
LISTENvirtual;
NOTIFYvirtual;
AsynchronousNOTIFY'virtual'frombackendwithpid'8448'received.
兼容性SQL92

在里没有NOTIFY语句.

REINDEX
Name
REINDEX--恢复一个损坏了的索引
Synopsis
REINDEX{TABLE|DATABASE|INDEX}name[FORCE]

输入
TABLE
重新建立声明的表的所有索引.
DATABASE
恢复一个声明了的数据库的所有系统索引.(不包括用户表的索引.)
INDEX
重新建立声明了的索引.
name
要重建的所声明的表/数据库/索引的名称.
FORCE
强制性重建系统索引.如果没有这个关键字,REINDEX忽略那些没有标记为非法的系统索引.FORCE和REINDEXINDEX或者重新建立用户索引是不相关的.
输出
REINDEX
如果表的索引成功重建,返回此信息.
描述
REINDEX用于重建损坏了的系统索引.尽管理论上这种情况决不应该发声,但实际上索引可能因为软件臭虫或者硬件失效而损坏.REINDEX提供了一种恢复手段.
如果你怀疑一个索引在某用户表上崩溃了,那么你可以简单地重建该索引,或者重建该表的所有索引,用REINDEXINDEX或者REINDEXTABLE命令.
注意:另外一个处理崩溃了的用户表索引是删除然后重建它.如果你同时还要维持一些在该表上表面的操作,那么这个方法可能更好.REINDEX在表上施加排它的锁,而CREATEINDEX只锁住写,而不会限止对表的读取操作.
如果你想从一个系统表造成的崩溃中恢复,那么问题就更复杂一些.在这种情况下,避免在做恢复的后端使用怀疑受损的索引本身是非常重要的.(实际上,在这种情况下,你可能会发现后端启动后马上就崩溃了,因为它们倚赖于这些已经崩溃的索引.)为了安全地恢复,你必需关闭postmaster,然后运行一个独立运行的PostgreSQL后端,给予它命令行参数-O和-P(这些选项分别是允许对系统表进行修改并且避免了系统索引的使用).然后发出REINDEXINDEXREINDEXTABLE,或者REINDEXDATABASE命令,具体取决于你想重新构造多少东西.如果觉得有疑问,那么用REINDEXDATABASEFORCE强制重建数据库中所有系统表.然后退出独立运行的后端,重启postmaster.
因为这种情况可能是大多数用户可能用到独立运行的后端的唯一机会,那么我们必需事先知道一些用法在顺序上的注意事项∶

用下面这样的命令启动后端

postgres-D$PGDATA-O-Pmy_database
用-D给数据库区域提供正确的路径,或者确保设置了环境变量PGDATA.还要声明你想操作的数据库名字.

你可以发出任何SQL命令,不仅仅是REINDEX
要注意独立运行的后端把换行符当做命令输入终止符;它可不懂分号是什么东西,分号是psql里的东西.要令一条命令跨多个行,你必需在除最后一个换行符之外的每个换行符之前键入一个反斜杠.同样,你也没有任何readline处理的便利可用(比如,没有命令历史).
要退出后端,键入EOF(通常是control-D).

参阅postgres手册页获取更多信息.
用法
重建表mytable上的索引:
REINDEXTABLEmytable;

重建单个索引∶
REINDEXINDEXmy_index;

重建所有系统索引(这个只能运行在独立运行的后端中.)
REINDEXDATABASEmy_databaseFORCE;

兼容性SQL92

在里没有REINDEX

RESET
Name
RESET--把一个运行时参数值恢复为缺省值
Synopsis
RESETvariable

RESETALL

输入
variable
请参考SET语句获取有关可用的参数的详细说明.
ALL
把所有运行时参数设置为缺省值.
描述
RESET将运行时参数恢复为缺省值.请参考SET命令令获取允许的变量值和缺省值的详细信息.RESET是下面语句的一个变种
SETvariableTODEFAULT

诊断
参阅SET命令.
例子
把DateStyle重新设为缺省值:
RESETDateStyle;
把Geqo重新设为缺省值:

RESETGEQO;
兼容性SQL92
RESET是PostgreSQL扩展.

REVOKE
Name
REVOKE--删除访问权限.
Synopsis
REVOKE{{SELECT|INSERT|UPDATE|DELETE|RULE|REFERENCES|TRIGGER}[,...]|ALL[PRIVILEGES]}
ON[TABLE]object[,...]
FROM{username|GROUPgroupname|PUBLIC}[,...]

描述
REVOKE允许一个对象的创建者撤销以前赋予(别人)的权限,可以是撤销一个或多个用户或者一组用户的权限.关键字PUBLIC代表隐含定义的拥有所有用户的组.
请注意,任何特定的用户都将拥有直接赋予他/她的权限,加上他/她所处的任何组,以及再加上赋予PUBLIC的权限的总和.因此,举例来说,废止PUBLIC的SELECT权限并不意味着所有用户都失去了对该对象的SELECT权限∶那些直接得到权限赋予的以及通过一个组得到权限的人仍然拥有该权限.
参阅GRANT命令的描述获取权限类型的含义.
注意
使用psql的\z命令显示在一个现存对象上赋予的权限.又见GRANT获取关于格式的信息.
例子
撤销公众在表films上的插入权限∶
REVOKEINSERTONfilmsFROMPUBLIC;
废除用户manuel对视图kinds的所有权限∶
REVOKEALLPRIVILEGESONkindsFROMmanuel;
兼容性SQL92

GRANT命令的兼容性SQL92信息基本上也适用于REVOKE.语法概要是∶
REVOKE[GRANTOPTIONFOR]{SELECT|INSERT|UPDATE|DELETE|REFERENCES}
ONobject[(column[,...])]
FROM{PUBLIC|username[,...]}
{RESTRICT|CASCADE}
如果user1给予user2权限WITHGRANTOPTION,然后user2把它给了user3,那么user1可以用CASCADE关键字废除所有这些权限.如果user1给了user2WITHGRANTOPTION权限,然后user2把它给了user3,然后如果user1想撤销这个权限,但是他声明了RESTRICT关键字,那么会失败.
又见
GRANT

ROLLBACK
Name
ROLLBACK--退出当前事务
Synopsis
ROLLBACK[WORK|TRANSACTION]

输入

输出
ABORT
成功的返回信息.
NOTICE:ROLLBACK:notransactioninprogress
如果当前进程没有任何事务,返回此信息.
描述
ROLLBACK回卷当前事务并取消当前事务中的所有更新.
注意
使用COMMIT语句将一次事务成功停止.ABORT是ROLLBACK同义词。
用法
取消所有更改:
ROLLBACKWORK;

兼容性SQL92

只声明了两种形式ROLLBACK和ROLLBACKWORK。否则完全兼容。

SELECTINTO
Name
SELECTINTO--从一个查询的结果中创建一个新表
Synopsis
SELECT[ALL|DISTINCT[ON(expression[,...])]]
*|expression[ASoutput_name][,...]
INTO[TEMPORARY|TEMP][TABLE]new_table
[FROMfrom_item[,...]]
[WHEREcondition]
[GROUPBYexpression[,...]]
[HAVINGcondition[,...]]
[{UNION|INTERSECT|EXCEPT}[ALL]select]
[ORDERBYexpression[ASC|DESC|USINGoperator][,...]]
[FORUPDATE[OFtablename[,...]]]
[LIMIT{count,]{count|ALL}]
[OFFSETstart]

这里
from_item可以是:

[ONLY]table_name[*]
[[AS]alias[(column_alias_list)]]
|
(select)
[AS]alias[(column_alias_list)]
|
from_item[NATURAL]join_typefrom_item
[ONjoin_condition|USING(join_column_list)]

输入
TEMPORARY
TEMP
如果声明了TEMPORARY或者TEMP,那么输出表就只在本次会话中创建,并且会话结束后自动删除.同名的现存永久表在临时表存在期间将不可见(在本次会话中).任何在临时表上创建的索引都是自动临时的.
new_table
要创建的新表名.这个表必须是尚未存在的.不过,我们可以在存在一个永久表的情况下创建一个(同名)临时表.
所有其它输入的域都在SELECT中有详细描述.
输出
请参考CREATETABLE和SELECT获取所有可能输出信息的摘要.
描述
SELECTINTO从一个查询的计算结果中创建一个新表.书局并不返回给客户端,这一点和普通的SELECT不同.新表的字段具有和SELECT的输出字段相关联(相同)的名字和数据类型.
注意:CREATETABLEAS的作用和SELECTINTO相同.我们建议使用CREATETABLEAS语法,因为SELECTINTO不是标准语法.实际上,这种类型的SELECTINTO是不能在PL/pgSQL或者ecpg中使用的,因为它们对INTO子句的解释是不同的.
兼容性SQL92
SELECT...INTO表示选取数值到一个宿主程序的标量变量中,而不是创建一个新表.的用法实际上就是在PL/pgSQL和ecpg里的用途.PostgreSQL用SELECTINTO代表创建表的意思是历史原因.在新代码里我们最好使用CREATETABLEAS实现这个目地.(CREATETABLEAS也不是标准,但至少它出现混淆的机会少一些.)

SELECT
Name
SELECT--从表或视图中取出若干行.
Synopsis
SELECT[ALL|DISTINCT[ON(expression[,...])]]
*|expression[ASoutput_name][,...]
[FROMfrom_item[,...]]
[WHEREcondition]
[GROUPBYexpression[,...]]
[HAVINGcondition[,...]]
[{UNION|INTERSECT|EXCEPT}[ALL]select]
[ORDERBYexpression[ASC|DESC|USINGoperator][,...]]
[FORUPDATE[OFtablename[,...]]]
[LIMIT{count|ALL}]
[OFFSETstart]
这里from_item可以是:
[ONLY]table_name[*]
[[AS]alias[(column_alias_list)]]
|
(select)
[AS]alias[(column_alias_list)]
|
from_item[NATURAL]join_typefrom_item
[ONjoin_condition|USING(join_column_list)]

输入
expression
表的列/字段名或一个表达式.
output_name
使用AS子句为一个列/字段或一个表达式声明另一个名称.这个名称主要用于标记输出列用于显示。它可以在ORDERBY和GROUPBY子句里代表列/字段的值.但是output_name不能用于WHERE或HAVING子句;用表达式代替.
from_item
一个表引用,子查询,或者JOIN子句.详见下文.
condition
一个布尔表达式,给出真或假的结果.参见下面描述的WHERE和HAVING子句.
select
一个选择语句,可以有除ORDERBY,FORUPDATE,和LIMIT子句以外的所有特性(甚至在加了括弧的情况下那些语句也可以用).
FROM项可以包括:
table_name
一个现存的表或视图的名字.如果声明了ONLY,则只扫描该表.如果没有声明ONLY,该表和所有其派生表(如果有的话)都被扫描.可以在表名后面跟一个*来表示扫所有其后代表,但在目前的版本里,这是缺省特性.(在PostgreSQL7.1以前的版本里,ONLY是缺省特性.)
alias
用于于前面的table_name.的替换名字,用于缩写或消除一个表自连接时的含混.(此时同一个表要扫描好几次.)如果写了别名,那么你也可以写一个字段别名列表,为表的一个或者几个字段提供替换名字.
select
一个在FORM子句里出现的子查询.它的输出作用好象是为这条SELECT命令在其生存期里创建一个临时表.请注意这个子查询必须用园括弧包围.并且必须给它加别名.
join_type
[INNER]JOINLEFT[OUTER]JOINRIGHT[OUTER]JOINFULL[OUTER]JOIN,或CROSSJOIN.之一.就INNER和OUTER连接类型,必须出现NATURALONjoin_condition,或USING(join_column_list)之一.对于CROSSJOIN,上面的项都不能出现.
join_condition
一个条件限制.类似WHERE条件,只不过它只应用于在这条JOIN子句里连接的两个from_item.
join_column_list
一个USING字段列表(a,b,...)是ON条件left_table.a=right_table.aANDleft_table.b=right_table.b...的缩写.
输出
Rows
你声明的查询返回的所有结果集的行.
count
查询返回的行的计数.
描述
SELECT将从一个或更多表中返回记录行。选择的侯选行是满足WHERE条件的所有行。或者如果省略了WHERE语句则选择表中的所有行.(参阅WHERE).子句
实际上,返回的行并不是由FROM/WHERE/GROUPBY/HAVING子句直接生成的行;其实,输出行是通过给每个选出的行计算SELECT输出表达式形成的.你可以在输出列表上写一个*表示选出的行的所有列.同样我们可以拿table_name.*表示来自该表的所以行.
DISTINCT将从选择出来的结果集中删除所有的重复的行。ALL(缺省)将返回所有侯选行,包括重复的行。
DISTINCTON删除匹配所有你声明的表达式的行,只保留每个重复集的第一行。DISTINCTON表达式是用和ORDERBY项一样的规则来解释的,见下文.注意这里每个重复集的"第一行"是不可预料的,除非我们用ORDERBY来保证我们希望的行最先出现。例如,
SELECTDISTINCTON(location)location,time,report
FROMweatherReports
ORDERBYlocation,timeDESC;

检索出每个地区的最近的天气预报。但是如果我们没有使用ORDERBY来强制每个地区按时间值降续排列,我们得到的将是每个地区的不可预料的时间的报告。
GROUPBY子句允许用户把表分成匹配一个或多个数值的不同行的组.(参考GROUPBY.)子句
HAVING允许只选择那些满足声明条件的行组(参阅HAVING.)子句
ORDERBY导致返回的行按照声明的顺序排列.如果没有给出ORDERBY,输出的行的顺序将以系统认为开销最小的顺序产生.(参阅ORDERBY.)子句
多个SELECT查询可以用UNION,INTERSECT,和EXCEPT操作符组合起来.必要时请使用圆括弧确定这些操作符的顺序.
UNION操作符计算是那些参与的查询所返回的行的集合。如果没有声明ALL,那么重复行被删除.(参阅UNION.)子句
INTERSECT给出两个查询公共的行。如果没有声明ALL,那么重复行被删除.(参阅INTERSECT.)子句
EXCEPT给出存在于第一个查询而不存在于第二个查询的行。如果没有声明ALL,那么重复行被删除.(参阅EXCEPT.)子句
FORUPDATE子句允许SELECT语句对选出的行执行排他锁。
LIMIT子句允许给用户返回一个查询生成的结果的子集。(参阅LIMIT.)子句
你必须有SELECT权限用来从表中读取数值(参阅GRANT/REVOKE语句.)
FROM子句
FROM子句为SELECT声明一个或多个源表.如果声明了多个源表,则概念上结果是所有源表所有行的迪卡尔积---不过通常会增加限制条件以把返回的行限制为迪卡尔积的一个小子集.
如果FROM项是一个简单表名字,它隐含包括来自该表子表(继承子表)的行.ONLY将消除从该表的子表来的行.在PostgreSQL7.1以前,这是缺省结果,而获取子表的行是通过在表名后面附加*实现的.这种老式性质可以通过命令SETSQL_InheritanceTOOFF;获取.
FROM项也可以是一个加了圆括弧的子查询(请注意子查询需要一个别名子句!).这个特性非常实用,因为这是在一条查询中获得多层分组,聚集,或者排序的唯一方法.
最后,FROM项可以是一条JOIN子句,它把两个简单的FROM项组合在一起.(必要时使用圆括弧来描述嵌套顺序.)
CROSSJOIN或INNERJOIN是简单的迪卡尔积,和你在顶层FROM里列出这两个项得到的一样.CROSSJOIN等效于INNERJOINON(TRUE),也就是说,不会有任何行被条件删除.这些连接类型只是符号上的便利,因为它们做得一点不比你只利用FROM和WHERE来的多.
LEFTOUTERJOIN返回所有符合条件的迪卡尔积(也就是说,所有符合它的ON条件的组合了的行),另外加上所有没有右手边行符合ON条件的左手边表中的行.这样的左手边行通过向右手边行插入NULL扩展为全长.请注意,当判断哪些行合格的时候,只考虑JOIN自己的ON或USING.然后才考虑外层的ON或WHERE条件.
相反,RIGHTOUTERJOIN返回所有连接的行,另外加上所有未匹配右手边行(左手边插入NULL扩展为全长).这个字句只是符号方便,因为你可以调换左右输入而改用LEFTOUTERJOIN.
FULLOUTERJOIN返回所有连接行,加上所有未匹配的左手边行(右边插入NULL扩展为全长),再加上所有未匹配的右手边行(左手边插入NULL扩展为全长).
除了CROSSJOIN以外的所有JOIN类型,你必须写ONjoin_condition,USING(join_column_list),和NATURAL中的一个.大多数情况下会是ON:你可以写涉及两个连接表的任何条件表达式.USING字段列表(a,b,...)是ON条件left_table.a=right_table.aANDleft_table.b=right_table.b...的缩写.另外,USING假设两对等式中只有一个包含在JOIN输出中,而不是两个.NATURAL是提及表中所有相似名字字段的USING列表的缩写.
WHERE子句
可选的WHERE条件有如下常见的形式:
WHEREboolean_expr

boolean_expr可以包含任意个得出布尔值的表达式。通常表达式会是
exprcond_opexpr

log_opexpr

这里cond_op可以是:=,<,<=,>,>=或<>,或条件操作符象ALL,ANY,IN,LIKE等,或者用户定义的操作符,而log_op可以为:AND,OR,NOT.SELECT将忽略所有WHERE条件不为TRUE的行.
GROUPBY子句
GROUPBY声明一个分了组的表,该表源于应用使用下面的子句:
GROUPBYexpression[,...]

GROUPBY将把所有在组合了的列上共享同样的值的行压缩成一行。如果存在聚集函数,这些聚集函数将计算每个组的所有行,并且为每个组计算一个独立的值(如果没有GROUPBY,聚集函数对选出的所有行计算出一个数值)。存在GROUPBY时,除了在聚集函数里面,SELECT输出表达式对任何非组合列的引用都是非法的,因为对一个非组合列会有多于一个可能的返回值。
一个在GROUPBY里面的条目还可以是输出列的名称或者序号(SELECT表达式),或者是一个从输入列的数值形成的任意表达式.当存在语义模糊时,一个GROUPBY名称将被解释成一个输入列/字段名称而不是一个输出列/字段名称.
HAVING子句
可选的HAVING条件有如下形式:
HAVINGboolean_expr

这里boolean_expr和为WHERE子句里声明的相同.
HAVING子句声明一个从前面的子句的结果集中去除了一些不符合boolean_expr.组后分组的表.HAVING与WHERE不同:WHERE在应用GROUPBY之前过滤出单独的行,而HAVING过滤由GROUPBY创建的行.
在boolean_expr里引用的每个列/字段应该清晰地指明一个组的列/字段,除非引用在一个聚集函数里。
ORDERBY子句
ORDERBYexpression[ASC|DESC|USINGoperator][,...]

一个ORDERBY项可以是一个输出列(SELECT表达式)的名字或者序数,或者它也可以是任何来自输入列值形成的表达式.在出现混淆的场合下,ORDERBY名字将被解释成一个输出名字.
序数指的是列/字段按顺序(从左到右)的位置.这个特性可以使得对没有一个合适名称的列/字段的排序成为可能.这一点可能永远没有用,因为总是可以通过AS子句给一个要计算的列/字段赋予一个名称,例如:
SELECTtitle,date_prod+1ASnewlenFROMfilmsORDERBYnewlen;

还可以ORDERBY任意表达式(一个对的扩展),包括那些没有出现在SELECT结果列表里面的域。因此下面的语句现在是合法的:
SELECTnameFROMdistributorsORDERBYcode;

这个特性的一个局限就是应用于UNION,INTERSECT,或者EXCEPT查询的ORDERBY子句只能在一个输出字段名或者数字上声明,而不能在一个表达式上声明.
请注意如果一个ORDERBY条目是一个匹配结果列和输入列的简单名称,ORDERBY将把它解释成结果列名称.这和GROUPBY在同样情况下做的选择正相反.这样的不一致是由标准强制的.
我们可以给ORDERBY子句里每个列/字段加一个关键字DESC(降序)或ASC(升序).如果不声明,ASC是缺省.我们还可以声明一个排序操作符来实现排序。ASC等效于使用'<'而DESC等效于使用'>'。
在一个域里,空值排序时排在其它数值前面.换句话说,升序排序时,空值排在末尾,而降序排序时空值排在开头.
UNION子句
table_queryUNION[ALL]table_query
[ORDERBYexpression[ASC|DESC|USINGoperator][,...]]
[LIMIT{count|ALL}[{OFFSET|,}start]]

这里table_query表明任何没有ORDERBY,FORUPDATE,或者LIMIT子句的选择表达式.(如果用圆括弧包围,ORDERBY和LIMIT可以放在子表达式里.如果没有圆括弧,这些子句将交给UNION的结果使用,而不是给它们右手边的输入表达式.)
UNION操作符的结果集是那些涉及到的所有查询所返回结果的集合。两个做为UNION直接操作数的SELECT必须生成相同数目的字段,并且对应的字段必须有兼容的数据类型。
缺省地,UNION的结果不包含任何重复的行,除非声明了ALL子句.ALL制止了消除重复的动作.
同一SELECT语句中的多个UNION操作符是从左向右计算的,除非用圆括弧进行了标识).
目前,FORUPDATE不能在UNION的结果或输入中声明.
INTERSECT子句
table_queryINTERSECT[ALL]table_query
[ORDERBYexpression[ASC|DESC|USINGoperator][,...]]
[LIMIT{count|ALL}]
[OFFSETstart]

这里table_query声明任何没有ORDERBY,FORUPDATE,或者LIMIT子句的选择表达式。
INTERSECT类似UNION,只不过它给出在两个查询中都出现的行,而不是两个查询的所有行.
INTERSECT的结果不包含任何重复行,除非你声明了ALL选项.用了ALL以后,一个在L里有m个重复而在R里有n个重复的行将出现min(m,n)次.
除非用圆括号指明顺序,同一SELECT语句中的多个INTERSECT操作符是从左向右计算的。INTERSECT比UNION绑定得更紧---也就是说AUNIONBINTERSECTC将读做AUNION(BINTERSECTC),除非你用圆括弧声明.
EXCEPT子句
table_queryEXCEPT[ALL]table_query
[ORDERBYexpression[ASC|DESC|USINGoperator][,...]]
[LIMIT{count|ALL}]
[OFFSETstart]

这里table_query声明任何没有ORDERBY,FORUPDATE,或者LIMIT子句的选择表达式。
EXCEPT类似于UNION,只不过EXCEPT给出存在于左边查询输出而不存在于右边查询输出的行。
EXCEPT的结果不包含任何重复的行,除非声明了ALL选项.使用ALL时,一个在L中有m个重复而在R中有n个重复的行将出现max(m-n,0)次.
除非用圆括弧指明顺序,同一SELECT语句中的多个EXCEPT操作符是从左向右计算的。EXCEPT和UNION绑定级别相同.
LIMIT子句
LIMIT{count|ALL}
OFFSETstart

这里count声明返回的最大行数,而start声明开始返回行之前忽略的行数。
LIMIT允许你检索由查询其他部分生成的行的某一部分。如果给出了限制计数,那么返回的行数不会超过哪个限制。如果给出了一个偏移量,那么开始返回行之前会忽略那个数量的行。
在使用LIMIT时,一个好习惯是使用一个ORDERBY子句把结果行限制成一个唯一的顺序。否则你会得到无法预料的查询返回的子集---你可能想要第十行到第二十行,但以什么顺序?除非你声明ORDERBY,否则你不知道什么顺序。
从PostgreSQL7.0开始,查询优化器在生成查询规划时把LIMIT考虑进去了,所以你很有可能因给出的LIMIT和OFFSET值不同而得到不同的规划(生成不同的行序)。因此用不同的LIMIT/OFFSET值选择不同的查询结果的子集将不会产生一致的结果,除非你用ORDERBY强制生成一个可预计的结果顺序。这可不是毛病;这是SQL生来的特点,因为除非用了ORDERBYE约束顺序,SQL不保证查询生成的结果有任何特定的顺序。
用法
将表films和表distributors连接在一起:
SELECTf.title,f.did,d.name,f.date_prod,f.kind
FROMdistributorsd,filmsf
WHEREf.did=d.did
title|did|name|date_prod|kind
---------------------------+-----+------------------+------------+----------
TheThirdMan|101|BritishLion|1949-12-23|Drama
TheAfricanQueen|101|BritishLion|1951-08-11|Romantic
UneFemmeestuneFemme|102|JeanLucGodard|1961-03-12|Romantic
Vertigo|103|Paramount|1958-11-14|Action
Becket|103|Paramount|1964-02-03|Drama
48Hrs|103|Paramount|1982-10-22|Action
WarandPeace|104|Mosfilm|1967-02-12|Drama
WestSideStory|105|UnitedArtists|1961-01-03|Musical
Bananas|105|UnitedArtists|1971-07-13|Comedy
Yojimbo|106|Toho|1961-06-16|Drama
There'saGirlinmySoup|107|Columbia|1970-06-11|Comedy
TaxiDriver|107|Columbia|1975-05-15|Action
AbsenceofMalice|107|Columbia|1981-11-15|Action
Storiadiunadonna|108|Westward|1970-08-15|Romantic
TheKingandI|109|20thCenturyFox|1956-08-11|Musical
DasBoot|110|BavariaAtelier|1981-11-11|Drama
BedKnobsandBroomsticks|111|WaltDisney||Musical
(17rows)

统计用kind分组的所有电影和组的列/字段的len(长度)的和:
SELECTkind,SUM(len)AStotalFROMfilmsGROUPBYkind;
kind|total
----------+-------
Action|07:34
Comedy|02:58
Drama|14:28
Musical|06:42
Romantic|04:38
(5rows)

统计所有电影(films),组的列/字段len(长度)的和,用kind分组并且显示小于5小时的组总和:
SELECTkind,SUM(len)AStotal
FROMfilms
GROUPBYkind
HAVINGSUM(len)<INTERVAL'5hour';
kind|total
----------+-------
Comedy|02:58
Romantic|04:38
(2rows)

下面两个例子是根据第二列(name)的内容对单独的结果排序的经典的方法:
SELECT*FROMdistributorsORDERBYname;
SELECT*FROMdistributorsORDERBY2;
did|name
-----+------------------
109|20thCenturyFox
110|BavariaAtelier
101|BritishLion
107|Columbia
102|JeanLucGodard
113|Lusofilms
104|Mosfilm
103|Paramount
106|Toho
105|UnitedArtists
111|WaltDisney
112|WarnerBros.
108|Westward
(13rows)

这个例子演示如何获得表distributors和actors的连接,只将每个表中以字母W开头的取出来.因为只取了不相关的行,所以关键字ALL被省略了:
distributors:actors:
did|nameid|name
-----+------------------+----------------
108|Westward1|WoodyAllen
111|WaltDisney2|WarrenBeatty
112|WarnerBros.3|WalterMatthau
......
SELECTdistributors.name
FROMdistributors
WHEREdistributors.nameLIKE'W%'
UNION
SELECTactors.name
FROMactors
WHEREactors.nameLIKE'W%'
name
----------------
WaltDisney
WalterMatthau
WarnerBros.
WarrenBeatty
Westward
WoodyAllen

兼容性SQL92
扩展
PostgreSQL允许我们在一个查询里省略FROM子句。这个特性是从最初的PostQuel查询语言里保留下来的它的最直接用途就是计算简单的常量表达式的结果:
SELECT2+2;
?column?
----------
4

其它有些DBMS不能这么做,除非引入一个单行的伪表做select的from.这个特性的另外一个不太明显的用途是把一个普通的从一个或多个表的select缩写:
SELECTdistributors.*WHEREdistributors.name='Westward';
did|name
-----+----------
108|Westward

这样也可以运行是因为我们给查询中引用了但没有在FROM中提到的每个表都加了一个隐含的FROM项.尽管这是个很方便的写法,但它却容易误用.比如,下面的查询
SELECTdistributors.*FROMdistributorsd;

可能就是个错误;用户最有可能的意思是
SELECTd.*FROMdistributorsd;

而不是下面的他实际上得到的无约束的连接
SELECTdistributors.*FROMdistributorsd,distributorsdistributors;

为了帮助检测这种错误,PostgreSQL7.1以及以后的版本将在你使用一条即有隐含FROM特性又有明确的FORM子句的查询的时候给出警告.

SELECT子句
在规范里,可选的关键字"AS"是多余的,可以忽略掉而不对语句产生任何影响.PostgreSQL分析器在重命名列/字段时需要这个关键字,因为类型扩展的特性会导致上下文语意不清.不过,"AS"在FROM项里是可选的.
DISTINCTON语法不是的标准。LIMIT和OFFSET也不是。
在里,一个ORDERBY子句只可以使用在结果列名称或者序号上,而GROUPBY子句只能用于输入列/字段上.PostgreSQL把这两个子句都扩展为允许另一种选择(但是如果出现冲突则使用标准的解释).PostgreSQL还允许两个子句声明任意的表达式.请注意,在表达式里出现的名称将总是被当做输入列/字段的名称,而不是结果列/字段名称.
UNION/INTERSECT/EXCEPT子句
的UNION/INTERSECT/EXCEPT语法允许一个附加的CORRESPONDINGBY选项:
table_queryUNION[ALL]
[CORRESPONDING[BY(column[,...])]]
table_query

CORRESPONDINGBY目前还不被PostgreSQL支持.

SETCONSTRAINTS
Name
SETCONSTRAINTS--设置当前事务的约束模式
Synopsis
SETCONSTRAINTS{ALL|constraint[,...]}{DEFERRED|IMMEDIATE}

描述
SETCONSTRAINTS设置当前事务里的约束运算的特性.在IMMEDIATE模式下,约束是在每条语句后面进行检查的.在DEFERRED模式下,一直到事务提交时才检查约束.
从创建的时候开始,一个约束总是表现为下面三个特性之一:INITIALLYDEFERRED,INITIALLYIMMEDIATEDEFERRABLE,或INITIALLYIMMEDIATENOTDEFERRABLE.第三个特性不会受SETCONSTRAINTS影响.
目前只有外键(foreignkey)约束受这个设置的影响.Check和unique约束总是有效地initiallyimmediatenotdeferrable(初始化立即执行无推迟).
兼容性SQL92
,SQL99
SETCONSTRAINT是和SQL99里定义的.

SETSESSIONAUTHORIZATION
Name
SETSESSIONAUTHORIZATION--为当前会话设置会话用户标识符和当前用户标识符
Synopsis
SETSESSIONAUTHORIZATION'username'
描述
这条命令把当前SQL会话环境里的会话用户标识和当前用户标识设置为username.
会话用户标识符一开始设置为(可能经过认证的)客户端提供的用户名.当前用户标识符通常等于会话用户标识符,但是可能在"setuid"的环境里或者类似的机制里临时改变.当前用户标识符和权限检查相关.
只有在初始会话用户(认证了的用户)有超级用户权限的时候才可以执行这条命令.这个权限在联接的周期中得以保存;比如,我们可以暂时变身成非超级用户,然后稍后切换回超级用户.
例子
SELECTSESSION_USER,CURRENT_USER;
current_user|session_user
--------------+--------------
peter|peter

SETSESSIONAUTHORIZATION'paul';

SELECTSESSION_USER,CURRENT_USER;
current_user|session_user
--------------+--------------
paul|paul
兼容性SQL92
SQL99
SQL99允许一些其它的表达式出现在文本username的位置上,不过这个东西实际上并不重要.PostgreSQL允许标识符语法("username"),而SQL不允许.SQL不允许在一个事务的过程中用这条命令;PostgreSQL没有这个限制,因为没有什么理由不允许这样用.标准中表示执行这条命令的权限要求是具体实现定义的.

SETTRANSACTION
Name
SETTRANSACTION--设置当前事务的特性
Synopsis
SETTRANSACTIONISOLATIONLEVEL{READCOMMITTED|SERIALIZABLE}
SETSESSIONCHARACTERISTICSASTRANSACTIONISOLATIONLEVEL
{READCOMMITTED|SERIALIZABLE}

描述
这条命令摄制事务隔离级别.SETTRANSACTION命令为当前SQL事务设置特性.它对后面的事务没有影响.这条命令在正在执行的事务使用了第一条查询或者修改数据的语句(DataModifyLanguage?)语句后就不能使用了(SELECTINSERTDELETEUPDATEFETCHCOPY).)SETSESSIONCHARACTERISTICS为一个会话中的每个事务设置缺省的隔离级别.SETTRANSACTION可以为一个独立的事务覆盖上面的设置.
事务的隔离级别决定一个事务在同时存在其它并行运行的事务时它能够看到什么数据.
READCOMMITTED
一条语句只能看到在它开始之前的数据.这是缺省.
SERIALIZABLE
当前的事务只能看到在这次事务第一条查询或者修改数据的语句执行之前的数据.
小技巧:说白了,serializable(可串行化)意味着两个事务将把数据库保持在同一个状态,就好象这两个事务是严格地按照先后顺序执行地那样.
兼容性SQL92
会话的缺省事务隔离级别也可以用命令
SETdefault_transaction_isolation='value'
以及在配置文件里设置.参考管理员手册获取更多信息.
兼容性SQL92
,SQL99
SERIALIZABLE是SQL里面的缺省隔离级别.PostgreSQL并不提供READUNCOMMITTED和REPEATABLEREAD隔离级别.因为我们使用了多版本并行控制,serializable(可串行化)级别并非真的可串行化,参阅用户手册获取细节.
在SQL里还有两种事务特性可以用这条命令设置:这个事务是否只读和诊断范围的大小.这两个概念都不被PostgreSQL支持.

SET
Name
SET--改变运行时参数
Synopsis
SETvariable{TO|=}{value|'value'|DEFAULT}
SETTIMEZONE{'timezone'|LOCAL|DEFAULT}

输入
variable
可设置的全局变量.
value
参数的新值.DEFAULT可以用于声明把参数恢复为缺省值.允许使用字串数组,但是更复杂的结构需要用单引号或者双引号引起来.
描述
SET命令改变运行时配置参数.可以改变的参数是:
CLIENT_ENCODING
NAMES
设置多字节客户端编码。声明的编码方式必须为后端支持。
这个特性只有在制作PostgreSQL的配置阶段声明了多字节(--enable-multibyte)支持后才生效。
DATESTYLE
设置日期/时间表示风格。有两个独立的配置需要设置:缺省的日期/时间输出和语意含糊的输入的解释.
下面是日期/时间输出风格:
ISO
使用ISO8601-风格的日期和时间(YYYY-MM-DDHH:MM:SS)这是缺省设置.
SQL
使用Oracle/Ingres-风格的日期和时间.请注意这个风格和SQL没有任何关系(SQL要求使用ISO8601风格),这个命名选项是历史原因.
PostgreSQL
使用传统PostgreSQL格式
German
使用dd.mm.yyyy作为数字日期表达式.
下面的两个选项决定"SQL"和"PostgreSQL"两个选项的输出格式的子风格,以及优先的含糊日期输入的解释.
European
使用dd/mm/yyyy作为数字化的日期表现形式.
NonEuropean
US
使用mm/dd/yyyy作为数字日期表现形式.
SETDATESTYLE的值可以是来自第一列中的一个(输出风格),或者是来自第二列中的一个(子风格),或者来自上面两个列表,并且用逗号分隔两个参数.
日期格式初始化可以用下面方法初始化:
设置PGDATESTYLE环境变量.如果一个基于libpq的客户端的环境里设置了PGDATESTYLE,libpq将在联接启动时自动把DATESTYLE设置成为PGDATESTYLE的值。
用-o-e参数运行postmaster可以把日期设置成European.
DateStyle选项只是为了移植应用用的.要格式化你的日期/时间值来做选择,请用to_char家族的函数.
SEED
为随机数生成器设置内部种子.
value
被random范围函数使用的种子的值.典型的值是介于0和1之间的浮点数,这个数随后乘以231-1.如果使用了超出范围的数值,生成的积自动溢出.
种子还可以通过调用setseedSQL函数设置:
SELECTsetseed(value);

SERVER_ENCODING
设置多字节服务器端编码方式.
这个特性只有在制作PostgreSQL的配置阶段声明了多字节支持后才生效。
TIMEZONE
TIMEZONE
为你的会话设置缺省时区.参数可以是一个SQL时间间隔常量,一个整数或者双精度常量,或者一个代表宿主操作系统支持地时区字串.
用于时区的可能值取决于你的操作系统.例如,在Linux上/usr/share/zoneinfo包含时区的数据库.
下面是一些时区的有效值:
'PST8PDT'
把时区值设为California.
'Portugal'
把时区值设为Portugal.
'Europe/Rome'
把时区值设为Italy
7
把时区设置为GMP以西7小时(等效于PDT).
INTERVAL'08:00'HOURTOMINUTE
把时区设置为GMP以西8小时(等效于PST).
LOCAL
DEFAULT
把时区值设为你的本地时区(你的操作系统确省的那个).
如果声明了一个非法的时区,时区就设为GMT(在大多数系统上如此).
如果一个基于libpq的客户端的环境里设置了PGTZ,libpq将在联接启动时自动把TIMEZONE设置成为PGTZ的值。
一个扩展的其它运行时参数列表可以在管理员手册里找到.
使用SHOW来显示当前的参数设置.
诊断
SETVARIABLE
成功的返回信息.
ERROR:notavalidoptionname:name
你试图设置的参数不存在.
ERROR:permissiondenied
为了访问一些设置,你必须是超级用户.
ERROR:namecanonlybesetatstart-up
有些参数在服务器启动后就无法更改了.
例子
把日期时间风格设置为传统的PostgreSQL风格,同时还有Europen(欧洲)风格:
SETDATESTYLETOPostgreSQL,European;
把时区设置为Berkeley,California,使用双引号保存时区声明里大写字符的属性(注意这里的日期/时间格式是ISO):

SETTIMEZONE"PST8PDT";
SELECTCURRENT_TIMESTAMPAStoday;

today
------------------------
1998-03-3107:41:21-08
设置时区为Italy(注意这里要求的单或者双引号来操作特殊的字符):

SETTIMEZONE'Europe/Rome';
SELECTCURRENT_TIMESTAMPAStoday;

today
------------------------
1998-03-3117:41:31+02
兼容性SQL92

上面显示的第二种语法(SETTIMEZONE)试图仿真.不过,SQL只允许数字时区偏移.所有其他参数设置(包括上面第一种语法)都是PostgreSQL扩展.

SHOW
Name
SHOW--显示运行时参数的数值
Synopsis
SHOWname

SHOWALL

输入
name
运行时参数的名称.参阅SET获取列表.
ALL
显示所有当前会话参数.
描述
SHOW将显示当前运行时参数的数值.这些变量可以通过SET语句来配置,或者在服务器启动时确定.
诊断
ERROR:notavalidoptionname:name
如果variable并不代表一个现存参数,返回这个参数.
ERROR:permissiondenied
要获取某些参数,你必须是超级用户.
NOTICE:Timezoneisunknown
如果没有设置TZ或PGTZ环境变量,返回此信息.
例子
显示当前DateStyle的设置:
SHOWDateStyle;
NOTICE:DateStyleisISOwithUS(NonEuropean)conventions
显示当前基因优化器(geqo)设置:
SHOWGEQO;
NOTICE:geqo=true
兼容性SQL92
SHOW命令是PostgreSQL扩展.

TRUNCATE
Name
TRUNCATE--清空一个表
Synopsis
TRUNCATE[TABLE]name

输入
name
要清空的表。
输出
TRUNCATE
如果表成功清空输出此信息。
描述
TRUNCATE快速地从一个表中删除所有行。它和无条件的DELETE有同样的效果,不过因为它不做表扫描,因而快得多。在大表上最有用。
我们不能在事务块(BEGIN/COMMIT对)里执行TRUNCATE,因为没有办法对其回卷.
用法
截断表bigtable∶
TRUNCATETABLEbigtable;

兼容性SQL92

里没有TRUNCATE

UNLISTEN
Name
UNLISTEN--停止监听通知信息
Synopsis
UNLISTEN{notifyname|*}

输入
notifyname
早先注册过的通知条件名称.
*
所有此后端当前正在监听的注册都将被清除.
输出
UNLISTEN
表面该语句已经执行.
描述
UNLISTEN用于删除一个现有的已注册的NOTIFY.UNLISTEN取消当前PostgreSQL会话中的所有对通知条件notifyname监听.特殊的条件通配符"*"则取消对当前会话的所有通知条件的监听.
NOTIFY包含一些对LISTENNOTIFY的使用的更广泛的讨论.
注意
notifyname不必是一个有效的表名,而可以是任何少于32字符的有效字串名.
如果你UNLISTEN一个你没有监听的事件,后端不会报错.每个后端在退出时都会自动执行UNLISTEN*
用法
提交一个现存的注册:
LISTENvirtual;
LISTEN
NOTIFYvirtual;
NOTIFY
AsynchronousNOTIFY'virtual'frombackendwithpid'8448'received
一旦执行了UNLISTEN,以后的NOTIFY命令将被忽略:
UNLISTENvirtual;
UNLISTEN
NOTIFYvirtual;
NOTIFY
--noticenoNOTIFYeventisreceived
兼容性SQL92

里没有UNLISTEN

UPDATE
Name
UPDATE--更新一个表中的行
Synopsis
UPDATE[ONLY]tableSETcol=expression[,...]
[FROMfromlist]
[WHEREcondition]

输入
table
现存表的名称.
column
表table中列/字段的名.
expression
赋予列/字段的一个有效的值或表达式.
fromlist
PostgreSQL的一个非标准的扩展,允许别的表中的列/字段出现在WHERE条件里.
condition
请参考SELECT语句获得WHERE子句的进一步描述.
输出
UPDATE#
成功的返回信息.#意味着更新的行数.如果#等于0则没有行被更新.
描述
UPDATE改变满足条件的所有行的声明了的列/字段的值。只有要更改的列/字段需要在语句中出现.
数组引用使用与SELECT里一样的语法.也就是说,单个数组元素,数组元素的一个范围或者是整个数组都可以用一个查询语句更新.
要更改表,你必须对它有写权限,同样对WHERE条件里提到的任何表也要有读权限.
缺省时,UPDATE将更新所声明的表和所有子表的记录.如果你希望只更新所声明的表,你应该使用ONLY子句.
用法
把字段kind里的词"Drama"用"Dramatic"代替:
UPDATEfilms
SETkind='Dramatic'
WHEREkind='Drama';
SELECT*
FROMfilms
WHEREkind='Dramatic'ORkind='Drama';

code|title|did|date_prod|kind|len
-------+---------------+-----+------------+----------+-------
BL101|TheThirdMan|101|1949-12-23|Dramatic|01:44
P_302|Becket|103|1964-02-03|Dramatic|02:28
M_401|WarandPeace|104|1967-02-12|Dramatic|05:57
T_601|Yojimbo|106|1961-06-16|Dramatic|01:50
DA101|DasBoot|110|1981-11-11|Dramatic|02:29
兼容性SQL92

在定义的UPDATE语句上定义了一些不同的语法:
UPDATEtableSETcolumn=expression[,...]
WHERECURRENTOFcursor

这里cursor表示一个打开的游标.

VACUUM
Name
VACUUM--垃圾收集以及可选地分析一个数据库
Synopsis
VACUUM[FULL][FREEZE][VERBOSE][table]
VACUUM[FULL][FREEZE][VERBOSE]ANALYZE[table[(column[,...])]]

输入
FULL
选择"完全"清理,这样可以恢复更多的空间,但是花的时间更多并且在表上施加了排它锁.
FREEZE
选择激进的元组"冻结".
VERBOSE
为每个表打印一份详细的清理工作报告.
ANALYZE
更新用于优化器的统计信息,以决定执行查询的最有效方法.
table
要清理的表的名称.缺省时是当前数据库中的所有表.
column
要分析的具体的列/字段名称.缺省是所有列/字段.
输出
VACUUM
命令完成.
NOTICE:--Relationtable--
表table的报告头.
NOTICE:Pages98:Changed25,Reapped74,Empty0,New0;Tup1000:Vac3000,Crash0,UnUsed0,MinLen188,MaxLen188;Re-using:Free/Avail.Space586952/586952;EndEmpty/Avail.Pages0/74.Elapsed0/0sec.
表table自身的分析数据.
NOTICE:Indexindex:Pages28;Tuples1000:Deleted3000.Elapsed0/0sec.
目标表的索引的分析.
描述
VACUUM回收已删除元组占据的存储空间.在一般的PostgreSQL操作里,那些已经DELETE的元组或者被UPDATE过后过时的元组是没有从它们所属的表中物理删除的;在完成VACUUM之前它们仍然存在.因此我们有必须周期地运行VACUUM,特别是在常更新的表上.
如果没有参数,VACUUM处理当前数据库里每个表,如果有参数,VACUUM只处理那个表.
VACUUMANALYZE先执行一个VACUUM然后是给每个选定的表执行一个ANALYZE.对于日常维护脚本而言,这是一个很方便的组合.参阅ANALYZE获取更多有关其处理的细节.
简单的VACUUM(没有FULL)只是简单地回收空间并且令其可以再次使用.这种形式的命令可以和对表的普通读写并行操作.VACUUMFULL执行更广泛的处理,包括跨块移动元组,以便把表压缩到最少的磁盘块数目里.这种形式要慢许多并且在处理的时候需要在表上施加一个排它锁.
FREEZE是一种特殊用途的选项,它导致元组尽可能快地标记为"冻结(frozen)",而不是等到它们已经相当老的时候才标记.如果在同一个数据库上没有其它运行着的事务的时候完成这个命令,那么系统就保证在数据库里的所有元组都是"冻结(frozen)"的,因此不会有事务ID重叠的问题,而和数据库未清理的时间没有关系.我们不建议把FREEZE用做日常用途.我们用它的唯一目地是准备和用户定义的模板数据库联接的时候,或者是其它完全是只读的,不会等到日常维护性VACUUM操作的数据库.参阅管理员手册获取细节.
注意
我们建议在经常VACUUMM(清理)(至少每晚一次)生产数据库,以保证不断地删除失效的行.尤其是在增删了大量记录之后,对受影响的表执行VACUUMANALYZE命令是一个很好的习惯.这样做将更新系统目录为最近的更改,并且允许PostgreSQL查询优化器在规划用户查询时有更好的选择.
我们不建议日常使用FULL选项,但是可以在特殊情况下使用.一个例子就是在你删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用.VACUUMFULL通常要比单纯的VACUUM收缩更多表的尺寸.
用法
下面是一个在regression(蜕变)数据库里某个表上执行VACUUM的一个例子:
regression=>VACUUMVERBOSEANALYZEonek;
NOTICE:--Relationonek--
NOTICE:Indexonek_unique1:Pages14;Tuples1000:Deleted3000.
CPU0.00s/0.11usecelapsed0.12sec.
NOTICE:Indexonek_unique2:Pages16;Tuples1000:Deleted3000.
CPU0.00s/0.10usecelapsed0.10sec.
NOTICE:Indexonek_hundred:Pages13;Tuples1000:Deleted3000.
CPU0.00s/0.10usecelapsed0.10sec.
NOTICE:Indexonek_stringu1:Pages31;Tuples1000:Deleted3000.
CPU0.01s/0.09usecelapsed0.10sec.
NOTICE:Removed3000tuplesin70pages.
CPU0.02s/0.04usecelapsed0.07sec.
NOTICE:Pages94:Changed0,Empty0;Tup1000:Vac3000,Keep0,UnUsed0.
TotalCPU0.05s/0.45usecelapsed0.59sec.
NOTICE:Analyzingonek
VACUUM

兼容性SQL92

里没有VACUUM语句.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: