CREATE USER
Name
CREATE USER -- 创建一个新的数据库用户帐户
Synopsis
CREATE USER username [ [ WITH ] option [ ... ] ]
这里 option 可以是∶
SYSID uid
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| IN GROUP groupname [, ...]
| VALID UNTIL 'abstime'
输入
username
用户名
uid
SYSID 子句可以用于选择正在被创建的用户的 PostgreSQL 用户标识。 这个用户标识不需要和 UNIX 系统用户标识匹配,但是有些人愿意让两者相同。
如果没有声明这个,缺省使用已分配的最高用户标识加一。
[ encrypted | unencrypted ] password
设置用户的口令,如果你不准备使用口令认证, 那么你可以省略这个选项,否则该用户将不能联接到一个口令认证的服务器上。
ENCRYPTED/UNENCRYPTED 控制口令在数据库中是否以加密 形式存储.使用加密口令存储的时候老的客户端可能有通讯问题.
参阅 管理员手册中关于客户端认证的部分 获取关于如何设置认证机制的详细信息。
CREATEDB
NOCREATEDB
这个子句定义用户的创建数据库权限. 如果声明了 CREATEDB,被定义的用户将允许创建其自己的数据库.而使用 NOCREATEDB 将否决该用户的创建数据库的能力. 如果忽略本子句,缺省是 NOCREATEDB.
CREATEUSER
NOCREATEUSER
该子句决定一个用户是否能创建一个新的用户. 这个选项同样把次用户变成数据库超级用户,可以跨越所有 访问限制。省略这个参数将置用户的这个属性为 NOCREATEUSER.
groupname
一个组名称,把这个用户设为该组成员。 你可以列出多个组名字.
abstime
VALID UNTIL (有效期)子句设置一个绝对时间,过了该时间后用户的 PostgreSQL 登陆将不再有效. 如果省略这个子句,登陆将总是有效的.
输出
CREATE USER
如果命令成功完成,返回此信息.
描述
CREATE USER将向一个 PostgreSQL 实例增加一个新用户.参考管理员手册获取关于管理用户和认证的信息。 要执行这条命令,你必须是一个数据库超级用户。
----------------------------
CREATE VIEW
Name
CREATE VIEW -- 定义一个视图
Synopsis
CREATE VIEW view AS SELECT query
输入
view
所要创建的视图名称.
query
一个将为视图提供行和列的 SQL 查询.
请参阅 SELECT 语句获取有效参数的更多信息.
输出
CREATE
如果视图创建成功,返回此信息.
ERROR: Relation 'view' already exists
如果在数据库中已经存在所声明的视图.
NOTICE: Attribute 'column' has an unknown type
如果不声明,所创建的视图将有一个未知类型的字段. 例如,下面命令返回一个警告:
CREATE VIEW vista AS SELECT 'Hello World'
然而下面命令将不出现警告:
CREATE VIEW vista AS SELECT text 'Hello World'
描述
CREATE VIEW将定义一个表的视图. 这个视图不是物理上实际存在(于磁盘)的.具体的说,自动生成 一个改写索引规则的查询用以支持在视图上的检索.
注意
目前,视图是只读的∶系统将不允许在视图上插入,更新,或者删除数据.你可以通过在视图上创建把插入等动作重写为向其它表做合适操作的规则来 实现可更新视图的效果.更多信息详见 CREATE RULE .
使用 DROP VIEW 语句删除视图.
用法
创建一个由所有 Comedy (喜剧)电影组成的视图:
CREATE VIEW kinds AS
SELECT *
FROM films
WHERE kind = 'Comedy';
SELECT * FROM kinds;
code | title | did | date_prod | kind | len
---+---------+---+----+----+---
UA502 | Bananas | 105 | 1971-07-13 | Comedy | 01:22
C_701 | There's a Girl in my Soup | 107 | 1970-06-11 | Comedy | 01:36
(2 rows)
兼容性 SQL92
为 CREATE VIEW 声明了一些附加的功能:
CREATE VIEW view [ column [, ...] ]
AS SELECT expression [ AS colname ] [, ...]
FROM table [ WHERE condition ]
[ WITH [ CASCADE | LOCAL ] CHECK OPTION ]
完整的命令可选的子句是:
CHECK OPTION
这个选项用于可更新视图. 所有对视图的 INSERT 和 UPDATE 都要经过视图定义条件的校验. 如果 没有通过校验,更新将被拒绝.
LOCAL
对这个视图进行完整性检查.
CASCADE
对此视图和任何相关视图进行完整性检查. 在既没有声明 CASCADE 也没有声明 LOCAL 时,假设为 CASCADE.
----------------------------
DECLARE
DECLARE
Name
DECLARE -- 定义一个游标
Synopsis
DECLARE cursorname [ BINARY ] [ INSENSITIVE ] [ SCROLL ]
CURSOR FOR query
[ FOR { READ ONLY | UPDATE [ OF column [, ...] ] ]
输入
cursorname
将在随后 FETCH 操作中使用的游标名.
BINARY
令游标以二进制而不是文本格式获取数据.
INSENSITIVE
关键字, 表明从游标检索出来的数据不应该被其他进程或游标的更新动作影响. 因为在 PostgreSQL 里,游标的操作总是发生在事务 里,所以总是符合上面描述.这个关键字没有作用.
SCROLL
关键字,表明每个 FETCH 操作可以检索出多行数据. 因为在PostgreSQL 在任何情况下都允许这样, 所以这个关键字没有作用.
query
一个 SQL 查询,它提供由游标控制的行. 请参考 SELECT 语句获取有关有效参数的详细信息.
READ ONLY
关键字,表明游标将用于只读模式. 因为这是 PostgreSQL 唯一的游标访问模式,所以该关键字没有作用.
UPDATE
关键字,表明游标将被用于更新表. 因为游标更新目前还不被 PostgreSQL 支持,所以这个关键字将产生一个错误信息.
column
将被更新的列.因为游标更新目前不被 PostgreSQL 支持, 所以 UPDATE 子句将产生一个错误信息.
输出
SELECT
如果 SELECT 成功运行,返回此信息.
NOTICE: Closing pre-existing portal "cursorname"
如果在当前的事务块中此游标名称已经定义,返回此信息. 前面定义的游标被丢弃.
ERROR: DECLARE CURSOR may only be used in begin/end transaction blocks
如果一个游标没有在事务块内部定义,返回此信息.
描述
DECLARE允许用户创建游标, 用于在一个大的查询里面检索少数几行数据. 使用 FETCH,游标可以既可以返回文本也可以返回二进制格式。 .
通常游标返回文本格式,要么是 ASCII 要么是某种由 PostgreSQL 特定的后端决定的编码方式. 因为数据在系统内部是用二进制格式存储的, 系统必须对数据做一定转换以生成文本格式.另外,文本格式一般都比对应的二进制格式占的存储空间大. 一旦格式转换回文本,客户应用需要将文本转换为二进制格式来操作. BINARY 游标给你返回内部二进制形态的数据。
作为例子,如果查询从一个整数列返回一个一, 在通常的游标里你将获得一个字符串'1'而如果是一个二进制查询,你将得到一个 4-字节的等于ctrl-A('^A')的数值.
游标应该小心使用 BINARY. 一些用户应用如 psql 是不识别二进制游标的, 而且期望返回的数据是文本格式.
而且,字符串表示方式是与硬件体系无关的, 而二进制格式会因不同的硬件体系不同而不同,而且 PostgreSQL 对二进制游标不做字节序解析或者其他格式转换 。 因此,如果你的客户机和服务器使用不同的格式 (如: "高位高字节" 和 "底位底字节").你可能就不会希望你的数据 以二进制格式返回.所以二进制游标将比文本略微快一点,因为二进制在服务器和客户端的数据传输中有较少的转换.
小技巧: 如果你希望用 ASCII 显示数据, 将数据以 ASCII 模式访问将节省客户端的工作.
注意
游标只能在事务中使用.使用 BEGIN, COMMIT和 ROLLBACK定义一个事务块。
在 中游标只能在嵌入 SQL (ESQL) 的应用中使用. PostgreSQL 后端没有一个明确的 OPEN cursor 语句;一个游标被认为在定义时就已经打开了. 不过,PostgreSQL嵌入的 SQL 预编译器, ecpg, 支持 习惯,包括那些和 DECLARE 和 OPEN 相关的语句.
用法
定义一个游标:
DECLARE liahona CURSOR
FOR SELECT * FROM films;
兼容性 SQL92
只允许在嵌入的 SQL 中和模块中使用游标. PostgreSQL 允许交互地使用游标. 允许嵌入或模块的游标更新数据库信息. 所有 PostgreSQL 的游标都是只读的. BINARY 关键字是 PostgreSQL 扩展.
----------------------------
DELETE
DELETE
Name
DELETE -- 删除一个表中的行
Synopsis
DELETE FROM [ ONLY ] table [ WHERE condition ]
输入
table
一个现存表的名字
condition
这是一个 SQL 选择查询,它返回要被删除的行.
请参考 SELECT 语句获取关于 WHERE 子句的更多信息.
输出
DELETE count
如果行被成功的删除返回此信息. count 是要被删除的行数.
如果 count 为 0, 没有行被删除.
描述
DELETE从指明的表里删除满足 WHERE condition (条件)的行.
如果 condition (WHERE 子句)不存在, 效果是删除表中所有行.结果是一个有效的空表.
小技巧: TRUNCATE 是一个 PostgreSQL 扩展, 它提供一个更快的从表中删除所有行的机制。
缺省时DELETE将删除所声明的表和所有它的子表的记录. 如果你希望只更新提到的表,你应该使用OLNY子句.
要对表进行修改,你必须有写权限,同样也必须有读表的权限,这样才能对符合 condition(条件) 的值进行读取操作.
用法
删除所有电影(films)但不删除音乐(musicals):
DELETE FROM films WHERE kind <> 'Musical';
----------------------------
DROP AGGREGATE
DROP AGGREGATE
Name
DROP AGGREGATE -- 删除一个用户定义的聚集函数
Synopsis
DROP AGGREGATE name type
输入
name
现存的聚集函数名。
type
现存的聚集函数的输入数据类型,或者 * -- 如果这个聚集函数接受任意输入类型.(请参考 PostgreSQL 用户手册 获取关于数据类型的更多信息)。
输出
DROP
命令成功的返回信息.
ERROR: RemoveAggregate: aggregate 'name' for type type does not exist
如果声明的函数在数据库中不存在,返回此信息.
描述
DROP AGGREGATE将删除对一个现存聚集函数的所有索引. 执行这条命令的用户必须是该聚集函数的所有者.
注意
使用 CREATE AGGREGATE语句创建一个聚集函数。
用法
将类型 int4的聚集函数 myavg 删除:
DROP AGGREGATE myavg(int4);
兼容性 SQL92
在 中没有 DROP AGGREGATE语句. 该语句是一个 PostgreSQL 语言的扩展.
----------------------------
DROP DATABASE
Name
DROP DATABASE -- 删除一个数据库.
Synopsis
DROP DATABASE name
输入
name
要被删除的现有数据库名.
输出
DROP DATABASE
如果命令成功执行,返回此命令.
DROP DATABASE: cannot be executed on the currently open database
你不能和准备删除的数据库建立联接.你需要和 template1 或者任何其它的数据库相连来运行这些命令.
DROP DATABASE: cannot be executed on the currently open database
执行这条命令之前你必须先结束正在处理的事务。
描述
DROP DATABASE删除一个现存数据库的目录入口并且删除包含数据的目录.只有数据库所有者能够执行这条命令(通常也是数据库创建者).
DROP DATABASE不能撤销,小心使用.
注意
这条命令在和目标数据库联接时不能执行. 通常更好的做法是用 dropdb脚本代替,该脚本是此命令的一个封装。 ,
请参考 CREATE DATABASE语句获取如何创建数据库的信息.
兼容性 SQL92
DROP DATABASE是一个 PostgreSQL 语言的扩展. 在 中没有这条命令.
----------------------------
DROP FUNCTION
Name
DROP FUNCTION -- 删除一个用户定义的函数
Synopsis
DROP FUNCTION name ( [ type [, ...] ] )
输入
name
现存的函数名称.
type
函数参数的类型.
输出
DROP
命令成功执行的返回信息.
NOTICE RemoveFunction: Function "name" ("types") does not exist
如果当前数据库里不存在所声明的函数,返回此信息.
描述
DROP FUNCTION 将删除一个现存的函数的引用.要执行这条命令,用户必须是函数的所有者. 必须声明函数的输入参数类型,因为几个不同的函数可能会有同样的名字 和不同的参数列表.
注意
请参考 CREATE FUNCTION 获取创建聚集函数的信息.
对依赖于该函数的类型, 操作符访问方式或者触发器是否事先被删除不做任何校验.
用法
这条命令删除平方根函数:
DROP FUNCTION sqrt(int4);
兼容性 SQL92
DROP FUNCTION是 PostgreSQL 语言的扩展.
SQL/PSM
SQL/PSM 是一个为实现函数扩展能力而提出的标准. SQL/PSM DROP FUNCTION 语句有下面的语法:
----------------------------
DROP GROUP
DROP GROUP
Name
DROP GROUP -- 删除一个用户组
Synopsis
DROP GROUP name
输入
name
现存组名。
输出
DROP GROUP
成功删除组后返回的信息。
描述
DROP GROUP从数据库中删除指定的组。组中的用户不被删除。 组中的用户不被删除。
使用 CREATE GROUP增加新组,用 ALTER GROUP修改组的成员。
用法
删除一个组:
DROP GROUP staff;
兼容性 SQL92
里没有 DROP GROUP.
----------------------------
DROP INDEX
Name
DROP INDEX -- 删除一个索引
Synopsis
DROP INDEX index_name [, ...]
输入
index_name
要删除的索引名.
输出
DROP
如果索引成功删除返回的信息.
ERROR: index "index_name" does not exist
如果 index_name 不是这个数据库的索引,返回此信息.
描述
DROP INDEX从数据库中删除一个现存的索引. 要执行这个命令,你必须是索引的所有者. the index.
注意
DROP INDEX是PostgreSQL 语言扩展.
请参考 CREATE INDEX语句获取如何创建索引的信息.
用法
此命令将删除title_idx 索引:
DROP INDEX title_idx;
兼容性 SQL92
定义用于访问纯关系型数据库的命令. 索引是一个与具体实现相关的特性,因而没有与具体实现相关的特性或定义在 语言里面.
----------------------------
DROP LANGUAGE
DROP LANGUAGE
Name
DROP LANGUAGE -- 删除一个用户定义的过程语言
Synopsis
DROP [ PROCEDURAL ] LANGUAGE 'name'
输入
name
现存语言的名称.
输出
DROP
如果语言成功删除,返回此信息.
ERROR: Language "name" doesn't exist
如果语言 name 没有找到,返回此信息.
描述
DROP PROCEDURAL LANGUAGE将删除曾注册过的过程语言 name.
注意
DROP PROCEDURAL LANGUAGE语句是 PostgreSQL 语言的扩展.
请参考 CREATE LANGUAGE获取如何创建过程语言的信息.
将不会校验用这种语言注册的函数或触发器是否仍然存在. 要想重新使用这些东西而不用删除和重新创建所有这些函数, 函数 pg_proc 的 prolang字段/属性必须调整为为 PL 重新创建的 pg_language 入口的新对象标识( OID).
用法
下面命令删除 PL/Sample 语言:
DROP PROCEDURAL LANGUAGE 'plsample';
兼容性 SQL92
在里没有 DROP PROCEDURAL LANGUAGE.
----------------------------
DROP OPERATOR
DROP OPERATOR
Name
DROP OPERATOR -- 删除一个用户定义操作符
Synopsis
DROP OPERATOR id ( lefttype | NONE , righttype | NONE )
输入
id
一个现存的操作符的标识符.
lefttype
该操作符左参数的类型.如果该操作符没有左参数, 写 NONE.
righttype
该操作符右参数的类型.如果该操作符没有右参数, 写 NONE.
输出
DROP
命令成功执行的返回函数.
ERROR: RemoveOperator: binary operator 'oper' taking 'lefttype' and 'righttype' does not exist
如果声明的双目操作符不存在,返回此信息.
ERROR: RemoveOperator: left unary operator 'oper' taking 'lefttype' does not exist
如果声明的左目操作符不存在,返回此信息.
ERROR: RemoveOperator: right unary operator 'oper' taking 'righttype' does not exist
如果声明的右目操作符不存在,返回此信息.
描述
DROP OPERATOR语句从数据库中删除一个现存的操作符. 要执行这个命令,你必须是操作符所有者.
左目操作符的右类型或右目操作符的左类型可以声明为 NONE.
注意
DROP OPERATOR语句是 PostgreSQL 语言扩展.
请参考 CREATE OPERATOR获取如何创建操作符的信息.
删除任何依赖于被删除的操作符的访问模式和操作符表是用户的责任.
用法
将用于int4的幂操作符 a^n 删除:
DROP OPERATOR ^ (int4, int4);
删除用于boolean变量的左目取反操作符(! b):
DROP OPERATOR ! (none, bool);
删除用于 int4的阶乘 (! i) : int4:
DROP OPERATOR ! (int4, none);
兼容性 SQL92
在里没有 DROP OPERATOR 语句.
----------------------------
DROP RULE
DROP RULE
Name
DROP RULE -- 删除一个重写规则
Synopsis
DROP RULE name [, ...]
输入
name
要删除的现存的规则.
输出
DROP
删除成功返回的信息.
ERROR: Rule or view "name" not found
如果声明的规则不存在,返回此信息.
描述
DROP RULE从声明的 PostgreSQL规则系统里删除一个规则. PostgreSQL 将立即停止使用之并且将会把它从系统表中清理出去.
注意
DROP RULE语句是 PostgreSQL 语言的扩展.
请参考 CREATE RULE 获取如何创建规则的信息.
一旦一个规则被删除掉,该规则所写的历史记录信息将可能不存在.
用法
删除重写规则 newrule:
DROP RULE newrule;
兼容性 SQL92
在 中没有DROP RULE.
----------------------------
DROP SEQUENCE
DROP SEQUENCE
Name
DROP SEQUENCE -- 删除一个序列
Synopsis
DROP SEQUENCE name [, ...]
输入
name
序列名.
输出
DROP
序列成功删除后返回的信息.
ERROR: sequence "name" does not exist
如果声明的序列不存在,返回此信息.
描述
DROP SEQUENCE从数据库中删除序列号生成器. 因为目前的序列实现是作为一个特殊的表,所以此语句就象 DROP TABLE 语句一样.
注意
DROP SEQUENCE语句是 Postgres 语言扩展.
请参考 CREATE SEQUENCE 语句获取如何创建一个序列的信息.
用法
从数据库中删除序列 serial:
DROP SEQUENCE serial;
兼容性 SQL92
在里没有 DROP SEQUENCE.
----------------------------
DROP TABLE
DROP TABLE
Name
DROP TABLE -- 删除一个表
Synopsis
DROP TABLE name [, ...]
输入
name
要删除的现存表或视图.
输出
DROP
如果命令成功完成,返回此信息.
ERROR: table "name" does not exist
果声明的表或视图在数据库中不存在.
描述
DROP TABLE从数据库中删除表或视图. 只有其所有者才能删除一个表或视图. 使用 DELETE 一个表可能没有任何行,但不会被删除.
如果被删除的表有从索引,它们将首先被删除. 从索引的删除将对所属表的内容没有任何影响.
注意
请参考 CREATE TABLE 和 ALTER TABLE 获取如何创建或更改表的信息.
用法
删除 films 和 distributors表:
DROP TABLE films, distributors;
兼容性 SQL92
为 DROP TABLE 声明了一些附加的功能:
DROP TABLE table { RESTRICT | CASCADE }
RESTRICT
确保只有不存在相关视图或完整性约束的表才可以被删除.
CASCADE
任何引用的视图或完整性约束都将被删除.
小技巧: 目前,要删除一个视图,你必须明确删除之.
----------------------------
DROP TRIGGER
DROP TRIGGER
Name
DROP TRIGGER -- 删除一个触发器定义.
Synopsis
DROP TRIGGER name ON table
输入
name
现存的触发器名.
table
表的名称.
输出
DROP
如果触发器成功的删除,返回此信息.
ERROR: DropTrigger: there is no trigger name on relation "table"
如果声明的触发器不存在,返回此信息.
描述
DROP TRIGGER将删除所有对一个现存触发器的引用. 要执行这个命令,当前用户必须是触发器的所有者.
注意
DROP TRIGGER是 PostgreSQL 语言的扩展.
请参考 CREATE TRIGGER 获取如何创建触发器的信息.
用法
删除表films的if_dist_exists触发器:
DROP TRIGGER if_dist_exists ON films;
兼容性 SQL92
在里没有DROP TRIGGER.
----------------------------
DROP TYPE
DROP TYPE
Name
DROP TYPE -- 删除一个用户定义数据类型
Synopsis
DROP TYPE typename [, ...]
输入
typename
现存的类型名.
输出
DROP
命令执行成功的返回信息.
ERROR: RemoveType: type 'typename' does not exist
如果声明的类型没有找到,返回此信息.
描述
DROP TYPE将从系统表里删除用户的类型.
只有类型所有者可以删除类型.
注意
DROP TYPE 语句是 PostgreSQL 语言的扩展.
请参考 CREATE TYPE 获取如何创建类型的信息.
用户有责任删除任何使用了被删除类型的操作符,函数,聚集,访问模式, 子类型和表.不过,相关等数组数据类型(由 CREATE TYPE 自动创建)将自动删除.
如果删除了一个内建的类型,后端的行为将不可预测.
用法
删除 box 类型:
DROP TYPE box;
兼容性 SQL92
SQL3
DROP TYPE是 SQL3 语句.
----------------------------
DROP USER
DROP USER
Name
DROP USER -- 删除一个数据库用户帐号
Synopsis
DROP USER name
输入
name
一个现存用户的名称.
输出
DROP USER
用户被成功删除的返回信息.
ERROR: DROP USER: user "name" does not exist
如果用户名没有找到,返回此信息.
DROP USER: user "name" owns database "name", cannot be removed
你必须先删除数据库或者改变其所有者。
描述
DROP USER从数据库中删除指定的用户。 它不删除数据库里此用户所有的表,视图或其他对象。 如果该用户拥有任何数据库,你会收到一个错误信息。
使用 CREATE USER增加新用户,用 ALTER USER修改用户属性。 PostgreSQL 还有一个脚本 dropuser,这个脚本和这条命令功能相同(实际上,脚本里调用此命令),但是可以在命令行上运行。
用法
删除一个用户帐户:
DROP USER jonathan;
兼容性 SQL92
在里没有DROP USER.
----------------------------
DROP VIEW
DROP VIEW
Name
DROP VIEW -- 删除一个视图
Synopsis
DROP VIEW name [, ...] 输入
name
现存视图名称.
输出
DROP
命令成功执行的返回.
ERROR: view name does not exist
如果声明的视图在数据库中不存在,返回此信息.
描述
DROP VIEW从数据库中删除一个现存的视图. 执行这条命令必须是视图的所有者.
注意
请参考CREATE VIEW 获取关于如何创建视图的信息.
用法
下面命令将删除视图 kinds:
DROP VIEW kinds; 兼容性 SQL92
为 DROP VIEW 声明了一些附加的功能:
DROP VIEW view { RESTRICT | CASCADE } 输入
RESTRICT
确保只有不存在关联视图或完整性约束的视图可以被删除.
CASCADE
任何引用的视图和完整性约束都将被删除.
注意
目前,要从 PostgreSQL 数据库中删除一个视图, 你必须明确地将其删除.
----------------------------
END
Name
END -- 提交当前的事务
Synopsis
END [ WORK | TRANSACTION ]
输入
WORK
TRANSACTION
可选关键字。没有作用。
输出
COMMIT
事务成功提交后的返回信息。
NOTICE: COMMIT: no transaction in progress
如果没有正在处理的事务,返回此信息。
描述
END是 PostgreSQL 而 -兼容的同义语句是 COMMIT.
注意
关键字 WORK 和 TRANSACTION 是多余的,可以省略。
使用 ROLLBACK退出一个事务。
用法
令所有改变生效:
END WORK;
兼容性 SQL92
END是 PostgreSQL 的扩展,提供与 COMMIT相同的功能。
----------------------------
EXPLAIN
EXPLAIN
Name
EXPLAIN -- 显示语句执行规划
Synopsis
EXPLAIN [ VERBOSE ] query
输入
VERBOSE
显示详细查询规划的标志.
query
任何 query (查询).
输出
NOTICE: QUERY PLAN: plan
PostgreSQL 后端明确的查询规划.
EXPLAIN
查询规划显示后发送的标志.
描述
这条命令显示PostgreSQL规划器为所提供的查询生成的执行规划。执行规划显示查询引用的表是如何被扫描的- 是简单的顺序扫描,还是 索引扫描等 - 并且如果引用了多个表, 采用了什么样的连接算法从每个输入的表中取出所需要的记录。
显示出来的最关键的部分是预计的查询执行开销, 这就是规划器对运行该查询所需时间的估计(以磁盘页面存取为单位计量)。实际上显示了两个数字:返回第一条记录前的启动时间, 和返回所有记录的总时间。对于大多数查询而言,关心的是总时间,但是, 在某些环境下,比如一个 EXISTS 子查询里, 规划器将选择最小启动时间而不是最小总时间 (因为执行器在获取一条记录后总是要停下来)。同样, 如果你用一条 LIMIT 子句限制返回的记录数, 规划器会在最终的开销上做一个合理的插值以计算哪个规划开销最省。
VERBOSE 选项输出规划树在系统内部的完整内容, 而不仅仅是一个概要(并且还把它发送给 postmaster 日志文件)。 通常这个选项只是对调试PostgreSQL有用。
注意
在 PostgreSQL 中只有很少的关于使用优化器的开销的文档.通常的关于查询优化的开销的估算可以在数据库的手册中找到. 请参考 程序员手册 中关于索引和基因查询优化器的章节获取更多信息.
用法
显示一个对只有一个 int4 列和 128 行的表的简单查询的查询规划:
EXPLAIN SELECT * FROM foo;
NOTICE: QUERY PLAN:
Seq Scan on foo (cost=0.00..2.28 rows=128 width=4)
EXPLAIN
对同一个拥有支持查询 equijoin 条件的索引的表, EXPLAIN 将显示一个不同的规划:
EXPLAIN SELECT * FROM foo WHERE i = 4;
NOTICE: QUERY PLAN:
Index Scan using fi on foo (cost=0.00..0.42 rows=1 width=4)
EXPLAIN
最后,同一个拥有支持查询 equijoin 条件的索引的表, EXPLAIN对使用一个聚集函数的查询将显示下面内容:
EXPLAIN SELECT sum(i) FROM foo WHERE i = 4;
NOTICE: QUERY PLAN:
Aggregate (cost=0.42..0.42 rows=1 width=4)
-> Index Scan using fi on foo (cost=0.00..0.42 rows=1 width=4)
注意这里显示的数字, 甚至还有选择的查询策略都有可能在各个 PostgreSQL版本之间不同--因为规划器在不断改进。
兼容性 SQL92
在 中没有EXPLAIN 语句.
----------------------------
FETCH
Name
FETCH -- 用游标从表中抓取行
Synopsis
FETCH [ direction ] [ count ] { IN | FROM } cursor
FETCH [ FORWARD | BACKWARD | RELATIVE ] [ # | ALL | NEXT | PRIOR ] { IN | FROM } cursor
输入
direction
selector定义抓取的方向.它可以是下述之一:
FORWARD
抓取后面的行. selector 省略时这是缺省值.
BACKWARD
抓取前面行.
RELATIVE
为 兼容设置的多余键字.
count
count决定抓取几行.可以是下列之一:
#
一个表明抓取几行的整数. 注意负整数等效于改变 FORWARD 和 BACKWARD 属性.
ALL
检索所有剩余的行.
NEXT
等效于声明 count 为 1.
PRIOR
等效于声明 count 为 -1.
cursor
一个打开的游标的名称.
输出
FETCH返回由声明游标定义的查询结果. 如果查询失败,将返回下面的信息:
NOTICE: PerformPortalFetch: portal "cursor" not found
如果 cursor 在前面没有定义,返回此信息.游标必须在一个事务块中定义.
NOTICE: FETCH/ABSOLUTE not supported, using RELATIVE
----------------------------
GRANT
Name
GRANT -- 定义访问权限
Synopsis
GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] objectname [, ...] TO { username | GROUP groupname | PUBLIC } [, ...]
描述
GRANT命令将某对象(表,视图,序列) 上的特定权限给予一个用户或者多个用户或者一组用户.这些权限将增加到那些已经赋予的权限上,如果存在这些权限的话.
键字 PUBLIC 表示该权限要赋予所有用户, 包括那些以后可能创建的用户.PUBLIC 可以看做是一个隐含定义好的组,它总是包括所有用户.请注意,任何特定的用户都将拥有直接赋予他/她的权限,加上 他/她所处的任何组,以及再加上赋予 PUBLIC 的权限的总和.
在创建完对象之后,除了对象的创建者之外, 其它用户没有任何访问该对象的权限,除非创建者赋予某些权限. 对对象的创建者而言,没有什么权限需要赋予,因为创建者自动持有所有权限.(不过,创建者出于安全考虑可以选择 废弃一些他自己的权限.请注意赋予和废止权限的能力是创建者与生具来的,并且不会丢失.删除对象的权利也是创建者固有的,并且不能赋予或 撤销.)
可能的权限有∶
SELECT
允许对声明的表,试图,或者序列 SELECT 仁义字段.还允许做 COPY 的源.
INSERT
允许向声明的表 INSERT 一个新行. 同时还允许做 COPY 的目标.
UPDATE
允许对声明的表中任意字段做 UPDATE . SELECT ... FOR UPDATE 也要求这个权限 (除了 SELECT 权限之外).比如, 这个权限允许使用nextval, currval 和 setval.
DELETE
允许从声明的表中 DELETE 行.
RULE
允许在该表/视图上创建规则.(参阅 CREATE RULE 语句.)
REFERENCES
要在一个表上创建一个外键约束,你必须在带参考健字的表上 拥有这个权限.
TRIGGER
允许在声明表上创建触发器.(参阅 CREATE TRIGGER 语句.)
ALL PRIVILEGES
把上面所有权限都一次赋予.PRIVILEGES 关键字在 PostgreSQL 里是可选的, 但是严格的 SQL 要求有这个关键字.
其它命令要求的权限都在相应的命令的参考页上列出.
注意
我们要注意数据库 superusers 可以访问所有对象, 而不会受对象的权限设置影响.这个特点类似 Unix 系统的 root 的权限.和 root 一样,除了必要的情况,总是以超级用户 身分进行操作是不明智的做法.
目前,要在 PostgreSQL 里只对某几列 赋予权限,你必须创建一个拥有那几行的视图然后给那个视图赋予权限.
使用 psql的 \z 命令 获取在现有对象上的与权限有关的信息.
Database = lusitania
+------+---------------+
| Relation | Grant/Revoke Permissions |
+------+---------------+
| mytable | {"=rw","miriam=arwdRxt","group todos=rw"} |
+------+---------------+
Legend:
uname=arwR -- privileges granted to a user
group gname=arwR -- privileges granted to a group
=arwR -- privileges granted to PUBLIC
r -- SELECT ("read")
w -- UPDATE ("write")
a -- INSERT ("append")
d -- DELETE
R -- RULE
x -- REFERENCES
t -- TRIGGER
arwdRxt -- ALL PRIVILEGES
用 REVOKE 命令删除访问权限.
例子
把表 films 的插入权限赋予所有用户∶
GRANT INSERT ON films TO PUBLIC;
赋予用户manuel对视图kinds的所有权限∶
GRANT ALL PRIVILEGES ON kinds TO manuel;
兼容性 SQL92
在 ALL PRIVILEGES 里的 PRIVILEGES 关键字是必须的.SQL 不支持在一条命令里 对多个表设置权限.
的 GRANT 语法允许在一个表里 为独立的字段设置权限,并且允许设置一个权限用来给其它人赋予同样的权限∶
GRANT privilege [, ...]
ON object [ ( column [, ...] ) ] [, ...]
TO { PUBLIC | username [, ...]
} [ WITH GRANT OPTION ]
SQL 允许对其它类型的对象赋予 USAGE 权限∶CHARACTER SET,COLLATION,TRANSLATION,DOMAIN.
TRIGGER 权限是 SQL99 引入的.RULE 权限是 PostgreSQL 扩展.
又见
REVOKE
----------------------------
INSERT
Name
INSERT -- 在表中创建新行
Synopsis
INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( expression [, ...] ) | SELECT query }
输入
table
现存表的名称.
column
表 table 中的列/字段名.
DEFAULT VALUES
所有字段都会用NULL或者创建表时用DEFAULT子句声明的值填充.
expression
赋予 column 的一个有效表达式或值.
query
一个有效的查询.请参考 SELECT 语句获取有效参数的进一步描述.
输出
INSERT oid 1
如果只插入了一行,返回此信息. oid OID 是被插入行的数字标识.
INSERT 0 #
如果插入了超过一行,返回此信息. # 是插入的行数.
描述
INSERT允许我们向表中插入新行. 我们可以一次插入一行或多行作为查询结果. 目标列表中的列/字段可以按任何顺序排列.
在目标列中没有出现的列/字段将插入缺省值, 要么是定义了的 DEFAULT 值或者 NULL。 如果向定义为 NOT NULL 的列中插入 NULL 值, PostgreSQL 将拒绝新列。
如果每行的表达式不是正确的数据类型,将试图进行自动的类型转换.