postgresql命令


PostgreSQL7.0手册-用户手册-19. SQL命令索引

第十九章. SQL 命令
内容 
ABORT — 退出当前事务 
ALTER GROUP — 向组中增加新用户,从组中删除用户 
ALTER TABLE — 修改表属性 
ALTER USER — 修改用户帐户信息 
BEGIN — 以链模式开始一个事务 
CLOSE — 关闭一个游标 
CLUSTER — 给服务器存储簇建议 
COMMENT — 向一个对象增加评注 
COMMIT — 提交当前事务 
COPY — 在文件和表之间拷贝数据 
CREATE AGGREGATE — 定义一个新的聚集函数 
CREATE CONSTRAINT TRIGGER — 创建一个支持约束的触发器 
CREATE DATABASE — 创建一个新数据库 
CREATE FUNCTION — 定义一个新函数 
CREATE GROUP — 创建一个新组 
CREATE INDEX — 构造一个从索引 
CREATE LANGUAGE — 为函数定义一门新语言 
CREATE OPERATOR — 定义一个新的用户操作符 
CREATE RULE — 定义一个新规则 
CREATE SEQUENCE — 创建一个新的序列数生成器 
CREATE TABLE — 创建一个新表 
CREATE TABLE AS — 创建一个新表 
CREATE TRIGGER — 创建一个新触发器 
CREATE TYPE — 定义一个新的基本数据类型 
CREATE USER — 创建一个新的数据库用户 
CREATE VIEW — 构造一个虚拟表 
DECLARE — 定义一个访问数据库的游标 
DELETE — 从表中删除行 
DROP AGGREGATE — 删除一个聚集函数的定义 
DROP DATABASE — 删除一个现有的表 
DROP FUNCTION — 删除一个用户定义的 C 函数 
DROP GROUP — 删除一个组 
DROP INDEX — 从一个数据库里删除一个索引 
DROP LANGUAGE — 删除一个用户定义的过程语言 
DROP OPERATOR — 从数据库里删除一个操作符 
DROP RULE — 从数据库里删除一个现有规则 
DROP SEQUENCE — 删除一个现存序列 
DROP TABLE — 从一个数据库里删除现存表 
DROP TRIGGER — 删除一个触发器的定义 
DROP TYPE — 从系统表里面删除一个用户定义类型 
DROP USER — 删除一个用户 
DROP VIEW — 从数据库里删除一个现存视图 
END — 提交当前事务 
EXPLAIN — 显示语句执行规划 
FETCH — 用一个游标获取行 
GRANT — 给一个用户,一个组或者所有用户赋予权限 
INSERT — 向数据库中插入新行 
LISTEN — 侦听一个通知条件的响应 
LOAD — 动态装载一个对象文件 
LOCK — 在一个事务内部显式锁定一个表 
MOVE — 移动游标的位置 
NOTIFY — 通知所有侦听某一通知条件的后端和前端 
REINDEX — 在单进程单用户 Postgres 条件下恢

复被破坏了的系统索引 
RESET — 为会话恢复缺省的运行时参数 
REVOKE — 废除一个用户,一个组或者所有用户的访问权限 
ROLLBACK — 退出当前的事务 
SELECT — 从一个表或者视图里检索行 
SELECT INTO — 从一个现有的表或者视图里创建新表 
SET — 为会话设置运行时参数 
SHOW — 为会话显示运行时参数 
TRUNCATE — 清空一个表 
UNLISTEN — 停止通知条件的侦听 
UPDATE — 调换一个表里某行的字段的值 
VACUUM — 清理和分析一个 Postgres 数据库 
这些是 Postgres 支持的SQL命令的索引.


----------------------------------------------------------------------------
----
ABORT
名称
ABORT -- 退出当前事务
语法
ABORT [ WORK | TRANSACTION ]
输入
无。 
输出
ROLLBACK 

成功的返回信息. 
NOTICE: ROLLBACK: no transaction in progress 
如果当前进程里没有任何事务存在. 
描述
ABORT 回卷当前事务并且废弃所有当前事务中做的更新.这个命令和SQL92 命令 RO
LLBACK 完全一样,只是由于历史原因而保留下来. 
注意
用 COMMIT 语句可以成功地结束/提交一个事务. 
用法
取消所有更改: 
ABORT WORK;
兼容性
SQL92
此命令是Postgres基于历史原因做的扩展.ROLLBACK 是 SQL92 中等价的命令. 
----------------------------------------------------------------------------
----
PostgreSQL7.0手册-用户手册-19. SQL命令-ALTER GROUP
编译:何伟平 laser@https://www.360docs.net/doc/f1722763.html, (2001-04-21 21:39:30)
ALTER GROUP
名称
ALTER GROUP -- 向组中增加用户或删除用户
语法
ALTER GROUP name ADD USER username [, ... ]
ALTER GROUP name DROP USER username [, ... ]
输入
name 
要更改的组名称。 
username 
准备向组中增加或从组中删除的用户名。用户名必须已经存在。 
输出
ALTER GROUP 
更改成功的返回信息。 
描述
ALTER GROUP 用于向组中增加用户或者从组中删除用户。只有数据库超级用户才能使
用这条命令。向组中增加用户并不创建用户。同样从组中删除用户也不删除用户本身。
 
使用 CREATE GROUP 创建新组以及 DROP GROUP 删除一个组。
用法
向组中增加用户: 
ALTER GROUP staff ADD USER karl, john
从组中删除用户: 
ALTER GROUP workers DROP USER beth
兼容性
SQL92
SQL92 里没有 ALTER GROUP 语句。角色(roles)的概念类似。
________________________________________________
PostgreSQL7.0手册-用户手册-19. SQL命令-ALTER TABLE
编译:何伟平 laser@https://www.360docs.net/doc/f1722763.html, (2001-04-21 21:40:56)
ALTER TABLE
名称
ALTER TABLE — 更改表属性
语法
ALTER T

ABLE table [ * ]
ADD [ COLUMN ] column type
ALTER TABLE table [ * ]
ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAUL
T }
ALTER TABLE table [ * ]
RENAME [ COLUMN ] column TO newcolumn
ALTER TABLE table
RENAME TO newtable
ALTER TABLE table
ADD table constraint definition
Inputs
table 
试图更改的现存表的名称. 
column 
现存或新的列名称. 
type 
新列的类型. 
newcolumn 
现存列的新名称. 
newtable 
表的新名称. 
table constraint definition 
表的新的约束定义. 
New table constraint for the table
输出
ALTER 
从被更名的列或表返回的信息. 
ERROR 
如果一个列或表不存在返回的信息.
描述
ALTER TABLE 变更一个现存表的定义.ADD COLUMN 形式用与 CREATE TABLE一样
的语法向表中增加一个新列/字段。ALTER COLUMN 形式允许你从列/字段中设置或者删
除缺省(值)。注意缺省(值)只对新插入的行有效。RENAME 子句可以在不影响相关
表中任何数据的情况下更改一个表或者列/字段的名称。因此,表或列/字段在此命令执
行后仍将是相同尺寸和类型。ADD table constraint definition 子句用与 CREA
TE TABLE一样的语法向表中增加一个新的约束。 

如果要改变表的属性,你必须是表的所有者. 
注意
COLUMN 关键字是多余的,可以省略. 
如果"*"跟在一个表名后面,表示该命令要对该表和所有继承级别低于该表的表进行操作
;缺省时,该属性(更改)不会增加到任何子表或修改任何子表的相关名称。当增加或
修改一个上级表(译注:继承级别高的表)的属性时总是应该这样的。否则,象下面这
样的在继承级上进行的查询 
SELECT NewColumn FROM SuperClass*
将不能工作,因为子表会比上级表少一个属性。 
在目前的实现里,新列/字段的缺省(值)和约束子句会被忽略。你可以随后用 ALTER
 TABLE 的 SET DEFAULT 形式设置缺省(值)。(你还不得不用 UPDATE 把已存
在行更新为缺省值。) 
在目前的实现里,只有 FOREIGN KEY 约束可以增加到表中.要创建或者删除一个唯
一约束,可以创建一个唯一索引(参阅 CREATE INDEX).要想增加 check (检查
)约束,你需要重建和重载该表,用的参数是 CREATE TABLE 命令的其他参数. 
要修改表的结构,你必须是表的所有人。不允许更改系统表结构的任何部分。PostgreS
QL 用户手册 里有关于继承的更多信息. 
 
请参考 CREATE TABLE 部分获取更多有效参数的描述. 
用法
向表中增加

一个 VARCHAR 列: 
ALTER TABLE distributors ADD COLUMN address VARCHAR(30);
对现存列改名: 
ALTER TABLE distributors RENAME COLUMN address TO city;
对现存表改名: 
ALTER TABLE distributors RENAME TO suppliers;
向表中增加一个外键约束: 
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address)
 REFERENCES addresses(address) MATCH FULL
兼容性
SQL92ADD COLUMN 形式是兼容的,除了上面说的缺省(值)和约束外。ALTER COLUM
N 形式是完全兼容的。 
SQL92 对 ALTER TABLE 声明了一些附加的Postgres目前还不直接支持的功能: 
ALTER TABLE table DROP CONSTRAINT constraint { RESTRICT | CASCADE 
}
增加或删除表的约束(比如象检查约束,唯一约束或外键约束)。要创建或删除一个唯
一约束,对应地创建或删除一个唯一索引,要修改其他类型的约束,你需要重建和重载
该表,使用 CREATE TABLE 命令的其他参数. 
例如,删除表 distributors 的任何约束: 
CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors AS SELECT * FROM temp;
DROP TABLE temp;
ALTER TABLE table DROP [ COLUMN ] column { RESTRICT | CASCADE }
前,要删除一个现存的列,表必须重新创建和重新装载: 
CREATE TABLE temp AS SELECT did, city FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors (
did DECIMAL(3) DEFAULT 1,
name VARCHAR(40) NOT NULL,
);
INSERT INTO distributors SELECT * FROM temp;
DROP TABLE temp;
重命名列/字段和表名是 PostgreSQL 扩展。SQL92 没有提供这些。 
___________________________________________________
PostgreSQL7.0手册-用户手册-19. SQL命令-ALTER USER
编译:何伟平 laser@https://www.360docs.net/doc/f1722763.html, (2001-04-21 21:41:21)
ALTER USER
名称
ALTER USER — 更改用户信息.
用法
ALTER USER username
[ WITH PASSWORD 'password' ]
[ CREATEDB | NOCREATEDB ] [ CREATEUSER | NOCREATEUSER ]
[ VALID UNTIL 'abstime' ]
输入
username 
想做更改的用户的用户名。 
password 
此帐号所使用的新口令. 
CREATEDB, NOCREATEDB 
这个子句定义该用户创建数据库的能力。如果声明了 CREATEDB,该用户可以创建她自
己的数据库。用NOCREATEDB 将剥夺一个用户创建数据库的能力。 
CREATEUSER, NOCREATEUSER 
这个子句决定一个用户能否创建新用户。这个选项同样还令该用户成为超级用户,可以
超越所有访问限制。 
abstime 
该用户帐号口令的有效日期(和可选的时

间)。 
输出
ALTER USER 
更改成功的返回信息. 
ERROR: ALTER USER: user "username" does not exist 
如果声明的用户不存在返回的信息. 
描述
ALTER USER 用于更改用户的 Postgres 帐号的属性.只有一个数据库超级用户可以
用这个命令更改权限和口令有效期。普通用户只能更改他们自己的口令。 
使用 CREATE USER 创建新用户和 DROP USER 删除用户。
用法
更改一用户口令: 
ALTER USER davide WITH PASSWORD 'hu8jmn3';
更改一用户有效期 
ALTER USER manuel VALID UNTIL 'Jan 31 2030';
更改一用户有效期,声明其权限应该在用比UTC早一小时的时区记时的1998年5月4日正午
失效 
ALTER USER chris VALID UNTIL 'May 4 12:00:00 1998 +1';
赋予一用户创建新用户和新数据库的权限. 
ALTER USER miriam CREATEUSER CREATEDB;
兼容性
SQL92
在 SQL92里没有 ALTER USER 语句.该标准将用户定义部分交给具体数据库实现处
理.
————————————————————————————
PostgreSQL7.0手册-用户手册-19. SQL命令-BEGIN
编译:何伟平 laser@https://www.360docs.net/doc/f1722763.html, (2001-04-21 21:41:48)
BEGIN
名称
BEGIN — 以链的模式开始一个事务
语法

BEGIN [ WORK | TRANSACTION ]
输入
WORK, TRANSACTION 
可选关键字。它们没有作用。 
输出
BEGIN 
这表明一个新的事务已经开始. 
NOTICE: BEGIN: already a transaction in progress 
这表明该事务已经运行,当前事务没有被影响. 
描述
缺省时,Postgres 以非链接模式(unchained mode)执行一个事务(在其他数据库系
统里也称之为“自动提交”("autocommit"))。换句话说,每个用户语句都是在其自
身的事务中运行并且在语句结束时隐含的调用一个提交(commit)(如果执行成功则提
交,否则调用一个回卷)。 BEGIN 以链接模式(chained mode)初始化一个用户事
务,也就是说所有 BEGIN 命令后的用户语句都将在一个事务里面执行直到一个显式的
 COMMIT,ROLLBACK,或执行退出。在链接模式里执行的语句很明显地快得多,因为事
务开始/提交(start/commit)需要大量的CPU和磁盘活动。在一个事务内部执行多条语
句时因为可能修改若干个相关的表因而同样需要一致性。 
在 Postgres 里缺省的事务隔离级别是 READ COMMITTED,这时在事务内部的查询只
看到查询提交之前的(数据)修改。所以,如果你需要更严格的事务隔离,你必须在 
BEGIN 后马上使用 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE。在 SER
IALIZABLE 模式里,查询将只能看到整个事务开始之前的修改。(实际上是在一个可串

化事务内部第一个 DML 语句执行前的数据)。 
如果提交了事务,Postgres 将保证要么实现所有更新,要么所有更新都没有实现。事
务有标准的ACID(不可分割性,一致性,隔离性,持续性)(atomic,consistent,is
olatable,and durable)属性。 
注意
请参考 LOCK 语句获取关于在事务内部锁定一个表的详细信息. 
使用 COMMIT 或 ROLLBACK 结束一个事务.
用法
开始一个用户事务: 
BEGIN WORK;
兼容性
SQL92
BEGIN 是 Postgres 语言的扩展.在 SQL92 中没有显式的 BEGIN 的定义;事务
初始化总是隐含的而且使用一个 COMMIT 或 ROLLBACK 语句终止. 
注意:许多关系型数据库为了方便提供一个自动提交(autocommit)特性。
顺便说一句,BEGIN 关键字在嵌入 SQL 里用于不同的目的。我们建议你在移植数据
库应用时仔细检查事务的语意。 
SQL92 还要求事务的缺省隔离级别是 SERIALIZABLE。
——————————————————————————
PostgreSQL7.0手册-用户手册-19. SQL命令-CLOSE
编译:何伟平 laser@https://www.360docs.net/doc/f1722763.html, (2001-04-21 21:42:28)
CLOSE
名称
CLOSE — 关闭一个游标 
语法
CLOSE cursor
输入
cursor 
一个待关闭的游标的名字. 
Outputs
CLOSE 
游标关闭成功返回的信息. 
NOTICE PerformPortalClose: portal "cursor" not found 
如果该 cursor 没有定义或已经关闭,返回该信息. 
描述
CLOSE 释放和一个游标关联的资源.一个游标关闭后,不允许对其再做任何操作.一个
不再使用的游标应该关闭掉. 
如果用COMMIT 或 ROLLBACK 提交了一个事务,将对每个打开的游标执行隐含的关闭
操作. 
注意
Postgres 没有显式的 OPEN (打开)游标的语句;我们认为一个游标在定义时就打
开了.使用 DECLARE 语句定义一个游标. 
用法
关闭游标 liahona: 
CLOSE liahona;
兼容性
SQL92
CLOSE 与 SQL92 完全兼容.
——————————————————————————————
PostgreSQL7.0手册-用户手册-19. SQL命令-CLUSTER
编译:何伟平 laser@https://www.360docs.net/doc/f1722763.html, (2001-04-21 21:42:59)
CLUSTER
名称
CLUSTER — 向服务器给出存储建簇的建议 

语法
CLUSTER indexname ON table
输入
indexname 
一个索引名称. 
table 
表的名称. 
输出
CLUSTER 
成功建簇. 
ERROR: relation inherits "table" 
表 tablerelation_number 是从表 "table"继承来的 
ERROR: Relation table does not exist! 
表 table 不存在 
描述
CLUSTER 指示 Postgres 近似地基于索引 indexname 的度量对表 table 进行存
储建簇.索引必须已经在表 table 上

定义了. 
当对一个表建簇后,该表的物理存储将基于索引信息进行.建簇是静态的,也就是说,
当表被更新后,改变的内容不会建簇.不会试图对更新过的记录重新建簇.如果需要,
可以通过手工执行该命令的方法重建簇. 
注意
该表实际上按索引顺序拷贝到了一个临时表中,然后重新改成原名.因此,在建簇时所
有赋予的权限和其它索引都将丢失. 
如果你只是随机的访问表中的行,那么在堆表中的数据的实际存储顺序是无关紧要的.
但是,如果你对某些数据的访问多于其他数据,而且有一个索引将这些数据分组,那你
就将从 CLUSTER 中获益. 
另一个 CLUSTER 很有帮助的例子是当你用索引从一个表中取出几个记录时.如果你从
一个表中请求一定索引范围的值,或者是一个索引过的值对应多行,CLUSTER 也会有助
于应用,因为如果索引标识出第一匹配行所在的堆存储页,所有其他行也可能已经在同
一堆存储页里了,这样便节省了磁盘访问的时间,加速了查询. 
有两种建簇的数据.第一种是用 CLUSTER 命令,此命令将原表按你声明的索引重新排
列.这个动作在操作大表时可能会很慢,因为每一行都从堆存储页里按索引顺序取出,
如果存储页表没有排序,整个表是随机存放在各个页面的,因而每行都要进行依次磁盘
页面操作.Postgres 有一个缓冲,但一个大表的主体是不可能都放到缓冲去的. 
另一个对数据建簇的方法是使用 
SELECT columnlist INTO TABLE newtable
FROM table ORDER BY columnlist
这个用法使用 Postgres 排序的代码 ORDER BY 来匹配索引,在对未排序的数据操
作时速度快得多.然后你可以删除旧表,用 ALTER TABLE/RENAME 将 temp 改成旧
表名,并且重建所有索引.唯一的问题是 OID 将不保留.这时再做 CLUSTER 将快
得多,因为大多数堆栈数据已经排过序了而且使用现有的索引. 
用法
以雇员的薪水属性对雇员关系建簇. 
CLUSTER emp_ind ON emp;
兼容性
SQL92
在 SQL92 规范里没有 CLUSTER 语句.
——————————————————————————————
PostgreSQL7.0手册-用户手册-19. SQL命令-COMMENT
编译:何伟平 laser@https://www.360docs.net/doc/f1722763.html, (2001-04-21 21:43:21)
COMMENT
名称
COMMENT -- 给一个对象增加评注
语法
COMMENT ON
[
[ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW 
]
object_name |
COLUMN table_name.column_name|
AGGREGATE agg_name agg_type|
FUNCTION func_name (arg1, arg2, ...)|
OPERATOR op (leftoperand_type rightoperand_type) |

TRIGGER trigger_name ON table_name
] IS 'text'
输入
object_name, table_name, column_name, agg_name, func_name, op, trigger
_name 


要加入评注的对象名称. 
text 
要加入的评注.
输出
COMMENT 
成功对表评注后的返回.
描述
COMMENT 向一个对象里增加评注,这个评注可以很容易用 psql 的 \dd 命令检索
出来.要删除一个评注,使用 NULL.当删除对象时,评注自动被删除掉.
用法
给表 mytable 加评注: 
COMMENT ON mytable IS 'This is my table.';
一些例子: 
COMMENT ON DATABASE my_database IS 'Development Database';
COMMENT ON INDEX my_index IS 'Enforces uniqueness on employee id';
COMMENT ON RULE my_rule IS 'Logs UPDATES of employee records';
COMMENT ON SEQUENCE my_sequence IS 'Used to generate primary keys';

COMMENT ON TABLE my_table IS 'Employee Information';
COMMENT ON TYPE my_type IS 'Complex Number support';
COMMENT ON VIEW my_view IS 'View of departmental costs';
COMMENT ON COLUMN my_table.my_field IS 'Employee ID number';
COMMENT ON AGGREGATE my_aggregate float8 IS 'Computes sample varianc
e';
COMMENT ON FUNCTION my_function (datetime) IS 'Returns Roman Numeral
';
COMMENT ON OPERATOR ^ (text, text) IS 'Performs intersection of tw
o text';
COMMENT ON TRIGGER my_trigger ON my_table IS 'Used for R.I.';
兼容性
SQL92
SQL92 里没有 COMMENT.
————————————————————————
PostgreSQL7.0手册-用户手册-19. SQL命令-COMMIT
编译:何伟平 laser@https://www.360docs.net/doc/f1722763.html, (2001-04-21 21:43:44)
COMMIT
名称
COMMIT — 提交当前事务 
语法
COMMIT [ WORK | TRANSACTION ]
输入
WORK, TRANSACTION 
可选关键字。没有作用。 
输出
COMMIT 
提交成功返回此信息. 
NOTICE: COMMIT: no transaction in progress 
如果过程中没有事务,返回此信息. 
描述
COMMIT 提交当前事务.所有事务的更改都将为其他事务可见,而且保证当崩溃发生时
的可持续性. 
注意
关键字 WORK 和 TRANSACTION 都可以忽略. 

使用 ROLLBACK 语句退出一次事务.
用法
要让所有变更永久化: 
COMMIT WORK;
兼容性
SQL92
SQL92 只声明了两种形式 COMMIT 和 COMMIT WORK。否则完全兼容

————————————————————————————

PostgreSQL7.0手册-用户手册-19. SQL命令-COPY
编译:何伟平 laser@https://www.360docs.net/doc/f1722763.html, (2001-04-21 21:44:57)
COPY
拷贝
COPY — 在表和文件之间拷贝数据
语法
COPY [ BINARY ] table [ WITH OIDS ]
FROM { 'filename' | s

tdin }
[ [USING] DELIMITERS 'delimiter' ]
[ WITH NULL AS 'null string' ]
COPY [ BINARY ] table [ WITH OIDS ]
TO { 'filename' | stdout }
[ [USING] DELIMITERS 'delimiter' ]
[ WITH NULL AS 'null string' ]
输入
BINARY 
改变字段格式属性,强制所有数据都使用二进制格式存储和读取. 

table 
现存表的名字. 
WITH OIDS 
拷贝每行的内部唯一对象标识(OID). 
filename 
输入或输出的Unix文件的绝对路径(文件)名. 
stdin 
声明输入是来自管道还是终端. 
stdout 
声明输出是进入管道还是终端. 
delimiter 
一个用于分隔输入或输出的域的分隔符. 
null print 
一个代表 NULL 值的字串。因历史原因,缺省是“\N”(反斜杠-N)。例如,你可以
自己挑一个空字串。 
注意:对于拷贝入(copy in),任何匹配这个字串的字串将被存储为 NULL 值,所
以你应该确保你用的字串和拷贝出(copy out)相同。
输出
COPY 
拷贝成功完成. 
ERROR: reason 
拷贝失败,原因在错误信息里. 
描述
COPY 在 Postgres 表和标准 Unix 文件之间交换数据.COPY 指示 Postgres 
后端直接从文件中读写数据.该文件必须为后端可见,而且文件名必须从后端的角度声
明.如果声明的是 stdin 或 stdout,数据通过客户前端流到后端. 
注意
BINARY 关键字将强制使用二进制对象而不是文本存储/读取所有数据.这样做在一定程
度上比传统的拷贝命令快,但移植性不是很好,而且生成的文件也较大,尽管这个方面
与数据本身密切相关. 
缺省地,文本拷贝使用 tab ("\t")字符作为分隔符.分隔符仍然可以用关键字 U
SING DELIMITERS 改成任何其它的字符.在数据中碰巧与分隔符相同的字符将用引号
引起. 
你对任何要 COPY 出来的数据必须有select权限,对任何要 COPY 入数据的表必须
有inser和update权限.使用 COPY 时后端同样需要适当的对文件操作的 Unix 权限
. 
关键字 USING DELIMITERS 声明一个作为所有列的分隔符的字符.如果在分隔符字串
里声明了多个字符,只使用第一个字符. 
小技巧: 不要把 COPY 和 psql 的命令\copy 混淆.
COPY 不会激活规则,也不会处理字段缺省值。不过它的确激活触发器。 
COPY 在第一个错误处停下来.这些在 COPY FROM 中不应该导致问题,但在 COPY
 TO 时目的表会部分改变.应该在一次失败的拷贝后用 VACUUM 查询做一些清除工
作. 
因为 Postgres 后端的工作目录通常和用户的工作目录不一样,本

地用户向一个文件
"foo"(没有附加的路径信息)可能会产生不可预见的结果.这时,foo 将生成在 $P
GDATA/foo. 通常,声明拷贝文件时要加上相对后端服务器的全路径. 
作为 COPY 参数声明的文件名必须存在与数据库服务器可访问的地方,不管是在本地
硬盘还是在网络文件系统上. 
如果使用了一个从一台机器到另一台机器的 TCP/IP 连接,而且声明了目标文件,那
么目标文件将会写到后端运行的机器上,而不是用户的机器上.
文件格式
文本格式
当不带 BINARY 选项使用 COPY TO 时,生成的文件每条记录占据一行,每列(字
段)用分隔符分开.内嵌的分隔符字符将由一个反斜杠("\")开头.字段值本身是由与
每个字段类型相关的输出函数生成的字符串.某一类型的输出函数本身不应该生成反斜
杠;这个任务由 COPY 本身完成. 
每个记录的实际格式是 
...
如果声明了 WITH OIDST,它将被放在每行的开头. 
如果 COPY 将它的输出输出到标准输出而不是一个文件,在拷贝结束时,它将在一个
新行上输出一个反斜杠("\")和一个句点("."),最后是一个换行符做为文件结束符
.类似,如果 COPY 从标准输入读入数据,它将把一行开头的由一个反斜杠("\")和
一个句点(".")和一个换行符组成的这三个连续字符作为文件结束符.不过,如果在这
三个字符组合之前碰到一个真的EOF(文件结束符) COPY 将结束 terminate (接
着就是后端自身). 
斜杠有其他的含义.NULL属性输出为"\N". 一个反斜杠字符输出成两个连续的反斜杠
("\\")一个tab字符用一个反斜杠后面跟一个tab代表. 一个新行字符用一个反斜杠
和一个新行代表.当装载不是由Postgres 生成的文件时,你需要将反斜杠字符 ("\
")转换成双反斜杠("\\")以保证正确装载.?/div> 
二进制格式
当使用 COPY BINARY,文件的头四个字节将是文件中记录的个数.如果数值是零, 
COPY BINARY 命令将一直读到文件尾.否则,它将在达到个数时停止读取.文件中剩
余的数据将被忽略. 
文件中每一实例的格式如下表.要注意本格式一定要 完全 符合.无符号的四字节整
数数量在下表中称做 uint32 . 
表 19-1. 二进制拷贝文件的内容 

 文件开始 
uint32 记录个数 
每条记录 
uint32 记录数据总长 
uint32 oid (如果声明了) 
uint32 null 字段的个数 
[uint32,...,uint32] 字段个数(attribute numbers of attributes), 从0开
始 
- <字段数据> 
二进制数据的对齐
在Sun-3s,2-字节字段以2-字节为界对齐,而所有

整数字段以4-字节为界对齐.字符
字段以1-字节为界对齐.在大部分其他机器上,所有大于1字节的整数是按照4-字节为
边界对齐的.注意,变长字段由字段长度在埃皇橹皇羌虻サ氖樵乩嘈偷牧鳎
?/div> 
用法
下面的例子将一个表拷贝到标准输出,使用竖直条("|")作为域分隔符: 
COPY country TO stdout USING DELIMITERS '|';
从一个 Unix 文件中拷贝数据到表 "country": 
COPY country FROM '/usr1/proj/bray/sql/country_data';
这里是一些可以从标准输入 stdin 输入的数据的例子(所以在最后有结束符): 

AF AFGHANISTAN
AL ALBANIA
DZ ALGERIA
...
ZM ZAMBIA
ZW ZIMBABWE
\.
同样的数据,输出到一个Linux/i586机器的二进制文件中去.数据是用 Unix 应用 
od -c 显示的.表里有三个域;第一个是char(2) 第二个是 text.所有记录在第三
字段有空(null)值.注意 char(2) 字段是如何用空(null)补齐成四个字节的以及
text字段是如何前面补长度的: 
355 \0 \0 \0 027 \0 \0 \0 001 \0 \0 \0 0
02 \0 \0 \0
006 \0 \0 \0 A F \0 \0 017 \0 \0 \0
A F G H
A N I S T A N 023 \0 \0 \0
 001 \0 \0 \0 002
\0 \0 \0 006 \0 \0 \0 A L \0 \0 \
v \0 \0 \0 A
L B A N I A 023 \0 \0 \0 001 
 \0 \0 \0 002 \0
\0 \0 006 \0 \0 \0 D Z \0 \0 \v \
0 \0 \0 A L
G E R I A
... \n \0 \0 \0 Z A
M B I A 024 \0
\0 \0 001 \0 \0 \0 002 \0 \0 \0 006 \0
\0 \0 Z W
\0 \0 \f \0 \0 \0 Z I M B A 
B W E
兼容性
SQL92
在SQL92里没有 COPY 语句. 
——————————————————————————

相关文档
最新文档