I. 教程
II. SQL 语言
III. 服务器管理
- 章14. 安装指导
- 章15. 在 Windows 上安装客户端
- 章16. 操作系统环境
- 章17. 服务器配置
- 章18. 数据库角色和权限
- 章19. 管理数据库
- 章21. 区域
- 章20. 用户认证
- 章22. 日常数据库维护工作
- 章23. 备份与恢复
- 章24. 高可用性与负载均衡
- 章25. 监控数据库的活动
- 章26. 监控磁盘使用情况
- 章27. 可靠性和预写式日志
- 章28. 回归测试
IV. 客户端接口
- Chapter 28. libpq - C 库
- 章29.
- Chapter 30. ecpg - 在 C 里嵌入 SQL
- Chapter 31. 信息模式
- 31.2. 数据类型
- 31.3. informationschemacatalog_name
- 31.4. applicable_roles
- 31.5. check_constraints
- 31.6. columndomainusage
- 31.7. column_privileges
- 31.8. columnudtusage
- 31.9. columns
- 31.10. constraintcolumnusage
- 31.11. constrainttableusage
- 31.12. datatypeprivileges
- 31.13. domain_constraints
- 31.14. domainudtusage
- 31.15. domains
- 31.16. element_types
- 31.17. enabled_roles
- 31.18. keycolumnusage
- 31.20. referential_constraints
- 31.21. rolecolumngrants
- 31.22. roleroutinegrants
- 31.23. roletablegrants
- 31.24. roleusagegrants
- 31.25. routine_privileges
- 31.26. routines
- 31.27. schemata
- 31.28. sql_features
- 31.29. sqlimplementationinfo
- 31.30. sql_languages
- 31.31. sql_packages
- 31.32. sql_sizing
- 31.33. sqlsizingprofiles
- 31.34. table_constraints
- 31.35. table_privileges
- 31.36. tables
- 31.37. triggers
- 31.38. usage_privileges
- 31.39. viewcolumnusage
- 31.40. viewtableusage
- 31.41. views
V. 服务器端编程
- 章33. 扩展 SQL
- 章34. 触发器
- 章35. 规则系统
- 章36. 过程语言
- 章37. PL/pgSQL - SQL 过程语言
- 章38. PL/Tcl - Tcl 过程语言
- 章39. PL/Perl - Perl 过程语言
- 章40. PL/Python - Python 过程语言
- 章41. 服务器编程接口
VI. 参考手册
- I. SQL 命令
- ABORT
- ALTER AGGREGATE
- ALTER CONVERSION
- ALTER DATABASE
- ALTER DOMAIN
- ALTER FUNCTION
- ALTER GROUP
- ALTER INDEX
- ALTER LANGUAGE
- ALTER OPERATOR
- ALTER OPERATOR CLASS
- ALTER ROLE
- ALTER SCHEMA
- ALTER SEQUENCE
- ALTER TABLE
- ALTER TABLESPACE
- ALTER TRIGGER
- ALTER TYPE
- ALTER USER
- ANALYZE
- BEGIN
- CHECKPOINT
- CLOSE
- CLUSTER
- COMMENT
- COMMIT PREPARED
- COMMIT
- COPY
- CREATE AGGREGATE
- CREATE CAST
- CREATE CONSTRAINT TRIGGER
- CREATE CONVERSION
- CREATE DATABASE
- CREATE DOMAIN
- CREATE FUNCTION
- CREATE GROUP
- CREATE INDEX
- CREATE LANGUAGE
- CREATE OPERATOR CLASS
- CREATE OPERATOR
- CREATE ROLE
- CREATE RULE
- CREATE SCHEMA
- CREATE SEQUENCE
- CREATE TABLE
- CREATE TABLE AS
- CREATE TABLESPACE
- CREATE TRIGGER
- CREATE TYPE
- CREATE USER
- CREATE VIEW
- DEALLOCATE
- DECLARE
- DELETE
- DROP OWNED
- DROP AGGREGATE
- DROP CAST
- DROP CONVERSION
- DROP DATABASE
- DROP DOMAIN
- DROP FUNCTION
- DROP GROUP
- DROP INDEX
- DROP LANGUAGE
- DROP OPERATOR CLASS
- DROP OPERATOR
- DROP ROLE
- DROP RULE
- DROP SCHEMA
- DROP SEQUENCE
- DROP TABLE
- DROP TABLESPACE
- DROP TRIGGER
- DROP TYPE
- DROP USER
- DROP VIEW
- END
- EXECUTE
- EXPLAIN
- FETCH
- GRANT
- INSERT
- LISTEN
- LOAD
- LOCK
- MOVE
- NOTIFY
- PREPARE TRANSACTION
- PREPARE
- REASSIGN OWNED
- REINDEX
- RELEASE SAVEPOINT
- RESET
- REVOKE
- ROLLBACK PREPARED
- ROLLBACK TO SAVEPOINT
- ROLLBACK
- SAVEPOINT
- SELECT
- SELECT INTO
- SET
- SET CONSTRAINTS
- SET ROLE
- SET SESSION AUTHORIZATION
- SET TRANSACTION
- SHOW
- START TRANSACTION
- TRUNCATE
- UNLISTEN
- UPDATE
- VACUUM
- II. PostgreSQL 客户端应用程序
- III. PostgreSQL 服务器应用程序
VII. 内部
- 章42. PostgreSQL 内部概貌
- 章43. 系统表
- 43.1. 概述
- 43.2. pg_aggregate
- 43.3. pg_am
- 43.4. pg_amop
- 43.5. pg_amproc
- 43.6. pg_attrdef
- 43.7. pg_attribute
- 43.8. pg_authid
- 43.9. pgauthmembers
- 43.10. pg_autovacuum
- 43.11. pg_cast
- 43.12. pg_class
- 43.13. pg_constraint
- 43.14. pg_conversion
- 43.15. pg_database
- 43.16. pg_depend
- 43.17. pg_description
- 43.18. pg_index
- 43.19. pg_inherits
- 43.20. pg_language
- 43.21. pg_largeobject
- 43.22. pg_listener
- 43.23. pg_namespace
- 43.24. pg_opclass
- 43.25. pg_operator
- 43.26. pg_pltemplate
- 43.27. pg_proc
- 43.28. pg_rewrite
- 43.29. pg_shdepend
- 43.30. pg_shdescription
- 43.31. pg_statistic
- 43.32. pg_tablespace
- 43.33. pg_trigger
- 43.34. pg_type
- 43.35. 系统视图
- 43.36. pg_cursors
- 43.37. pg_group
- 43.38. pg_indexes
- 43.39. pg_locks
- 43.40. pgpreparedstatements
- 43.41. pgpreparedxacts
- 43.42. pg_roles
- 43.43. pg_rules
- 43.44. pg_settings
- 43.45. pg_shadow
- 43.46. pg_stats
- 43.47. pg_tables
- 43.48. pgtimezoneabbrevs
- 43.49. pgtimezonenames
- 43.50. pg_user
- 43.51. pg_views
- 章44. 前/后端协议
- 章45. PostgreSQL 编码约定
- 章46. 本地语言支持
- 章47. 书写一个过程语言处理器
- 章48. 基因查询优化器
- 章49. 索引访问方法接口定义
- 章50. GiST 索引
- 章51. GIN 索引
- 章52. 数据库物理存储
- 章53. BKI 后端接口
- 章54. 规划器如何使用统计信息
VIII. 附录
ALTER TABLE
名称
ALTER TABLE--修改表的定义语法
ALTER TABLE [ ONLY ]name
[ * ]action
[, ... ] ALTER TABLE [ ONLY ]name
[ * ] RENAME [ COLUMN ]column
TOnew_column
ALTER TABLEname
RENAME TOnew_name
ALTER TABLEname
SET SCHEMAnew_schema
这里的action
是下列之一: ADD [ COLUMN ]column
type
[column_constraint
[ ... ] ] DROP [ COLUMN ]column
[ RESTRICT | CASCADE ] ALTER [ COLUMN ]column
TYPEtype
[ USINGexpression
] ALTER [ COLUMN ]column
SET DEFAULTexpression
ALTER [ COLUMN ]column
DROP DEFAULT ALTER [ COLUMN ]column
{ SET | DROP } NOT NULL ALTER [ COLUMN ]column
SET STATISTICSinteger
ALTER [ COLUMN ]column
SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ADDtable_constraint
DROP CONSTRAINTconstraint_name
[ RESTRICT | CASCADE ] DISABLE TRIGGER [trigger_name
| ALL | USER ] ENABLE TRIGGER [trigger_name
| ALL | USER ] CLUSTER ONindex_name
SET WITHOUT CLUSTER SET WITHOUT OIDS SET (storage_parameter
=value
[, ... ] ) RESET (storage_parameter
[, ... ] ) INHERITparent_table
NO INHERITparent_table
OWNER TOnew_owner
SET TABLESPACEnew_tablespace
描述
ALTER TABLE
变更一个现存表的定义。它有好几种子形式:
ADD COLUMN
这种形式使用和 CREATE TABLE 一样的语法向表中增加一个新的字段。
DROP COLUMN
这种形式从表中删除一个字段。和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须说
CASCADE
,比如外键参考、视图等等。ALTER COLUMN TYPE
这种形式改变表中一个字段的类型。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型,方法是重新分析最初提供的表达式。可选的
USING
子句声明如何从旧的字段值里计算新的字段值;如果省略,那么缺省的转换就是从旧类型向新类型的赋值转换。如果从旧数据类型到新类型没有隐含或者赋值的转换,那么必须提供一个USING
SET
/DROP DEFAULT
这种形式为一个字段设置或者删除缺省值。请注意缺省值只应用于随后的
INSERT
命令;它们不会修改表中已经存在的行。也可以为视图创建缺省,这个时候它们是在视图的ON INSERT
规则应用之前插入INSERT
语句中去的。SET
/DROP NOT NULL
这些形式修改一个字段是否允许 NULL 值或者拒绝 NULL 值。如果表在字段中包含非 NULL ,那么你只可以
SET NOT NULL
SET STATISTICS
这个形式为随后的 ANALYZE 操作设置针对每个字段的统计收集目标。目标的范围可以在 0 到 1000 之内设置;设置为 -1 表示重新恢复到使用系统缺省的统计目标(default_statistics_target)。有关 PostgreSQL 查询规划器使用的统计信息的更多信息,请参考节13.2。
SET STORAGE
这种形式为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。
PLAIN
必需用于定长的数值(比如integer
)并且是内联的、不压缩的。MAIN
用于内联、可压缩的数据。EXTERNAL
用于外部保存、不压缩的数据,EXTENDED
用于外部的压缩数据。EXTENDED
是大多数支持非PLAIN
存储的数据的缺省。使用EXTERNAL
将令在text
和bytea
字段上的子字符串操作更快,但付出的代价是增加了存储空间。请注意SET STORAGE
本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。参阅节52.2获取更多信息。ADD
table_constraint
这个形式给表增加一个新的约束,用的语法和 CREATE TABLE 一样。
DROP CONSTRAINT
这个形式删除一个表上的约束。
DISABLE
/ENABLE TRIGGER
这个形式关闭或者打开属于该表的触发器。一个被关闭掉的触发器是系统仍然知道的,但是在触发器事件发生的时候不会被执行。对于一个推迟了的触发器,在事件发生的时候会检查打开状态,而不是在函数实际执行的时候。可以通过指定名字的方法打开或者关闭任意一个触发器,或者是该表上的所有触发器,或者只是用户触发器(这个选项排除了那些用于实现外键约束的触发器)。打开或者关闭约束触发器要求超级用户权限;这么做的时候应该小心,因为如果触发器不执行的话,约束保证的数据完整性也就没有办法确保了。
CLUSTER
这种形式为将来的 CLUSTER 选项选择缺省索引。它实际上并不对表重新群集。
SET WITHOUT CLUSTER
这种形式从表中删除最新使用的 CLUSTER 索引。这样会影响将来那些没有声明索引的群集操作。
SET WITHOUT OIDS
这种形式从表中删除
oid
系统字段。它和DROP COLUMN oid RESTRICT
完全相同,只不过是如果表上已经没有oid
字段的时候不会报错。请注意,不存在某种
ALTER TABLE
的变种可以在删除了 OID 之后再把它们恢复回来。SET (
storage_parameter
=value
[, ... ] )这种形式修改表的一个或多个存储参数。参见 CREATE TABLE 获取可用参数的细节。需要注意的是表的内容不会被此命令立即修改,根据参数的不同可能需要重写表以获得想要的效果。可以通过 CLUSTER 或某种
ALTER TABLE
重写一个表。【注意】当
CREATE TABLE
允许用WITH (
语法指定storage_parameter
)OIDS
的时候,ALTER TABLE
并不将OIDS
看作存储参数。RESET (
storage_parameter
[, ... ] )这种形式重置表的一个或多个存储参数。与
SET
一样,根据参数的不同可能需要重写表才能获得想要的效果。INHERIT
parent_table
这种形式将目标表添加为指定父表的新子表。之后在父表上的查询将包含目标表中的记录。要被添加为一个子表,目标表必须已经包含所有与父表相同的字段(除此之外当然也可以包含一些其它字段),这些字段的数据类型必须匹配,并且如果父表的字段有
NOT NULL
约束的话子表的相应字段也必须有NOT NULL
约束。所有父表的
CHECK
约束必须同时与子表的约束匹配。当前UNIQUE
,PRIMARY KEY
,FOREIGN KEY
约束不被考虑在内,但是将来可能会有所改变。NO INHERIT
parent_table
这种形式从指定父表的子表列表中删除目标表。这样,在父表上的查询将不再目标表中的记录。
OWNER
这种形式将表、序列、视图的属主改变成指定的用户。
SET TABLESPACE
这种形式将表空间修改为指定的表空间并相关的数据文件移动到新的表空间。但是表上的所有索引都不会被移动,索引可以通过另外一个单独的
SET TABLESPACE
命令移动。参见 CREATE TABLESPACE 。RENAME
RENAME
形式改变一个表(或者索引、序列、视图)的名字,或者是表中独立字段的名字。它们对存储的数据没有影响。SET SCHEMA
这种形式把表移动到另外一个模式。相关的索引、约束、序列都跟着移动。
除了 RENAME
和 SET SCHEMA
之外所有动作都可以捆绑在一个多次修改列表中并行使用。比如,可以在一个命令里增加几个字段和/或修改几个字段的类型。对于大表,这么做特别有用,因为只需要对该表做一次处理。
要使用 ALTER TABLE
,你必须拥有该表。要修改一个表的模式,你还必须在新模式上拥有 CREATE
权限。要把该表添加为一个父表的新子表,你必须同时拥有父表。要修改所有者,你还必须是新的所有角色的直接或间接成员,并且该成员必须在此表的模式上有 CREATE
权限。这些限制强制了修改该所有者不会做任何通过删除和重建表不能做的事情。不过,超级用户可以以任何方式修改任意表的所有权。
参数
name
试图更改的现存表(可能有模式修饰)的名称。如果声明了
ONLY
,则只更改该表。如果没有声明ONLY
,则该表及其所有后代表(如果有)都被更新。可以在表名字后面附加一个*
表示所有后代表都被扫描,但是在目前的版本里,这是缺省行为。缺省可以通过改变配置选项 sql_inheritance 来改变。column
现存或新的字段名称
new_column
现存字段的新名称
new_name
表的新名称
type
新字段的类型,或者现存字段的新类型。
table_constraint
新的表约束定义
constraint_name
要删除的现有约束的名字
CASCADE
级联删除依赖于被依赖字段或者约束的对象(比如引用该字段的视图)
RESTRICT
如果字段或者约束还有任何依赖的对象,则拒绝删除该字段。这是缺省行为。
trigger_name
要打开或者关闭的单个触发器的名字
ALL
打开或者关闭属于该表的所有触发器。如果这些触发器中有外键约束,那么就要求超级用户权限。
USER
打开或者关闭所有属于该表的非外键约束触发器
index_name
要标记为群集的表上面的索引名字
storage_parameter
表的存储参数的名字
value
表的存储参数的新值,根据参数的不同,可能是一个数字或单词。
parent_table
将要与该表建立/取消关联的父表
new_owner
该表的新所有者的用户名
new_tablespace
这个表将要移动到的表空间名字
new_schema
表将前往的新模式的名字
注意
COLUMN
关键字是多余的,可以省略。
如果用 ADD COLUMN
增加一个字段,那么所有表中现有行都初始化为该字段的缺省值(如果没有声明 DEFAULT
子句,那么就是 NULL)。
用一个非空缺省值增加一个字段或者改变一个字段的现有类型会重写整个表。对于大表来说,这个操作可能会花很长时间;并且它还临时需要两倍的磁盘空间。
增加一个 CHECK
或 NOT NULL
约束将会扫描该表以保证现有的行符合约束要求。
提供在一个 ALTER TABLE
里面声明多个修改的主要原因是原先需要的对表的多次扫描和重写可以组合成一个步骤。
DROP COLUMN
命令并不是物理上把字段删除,而只是简单地把它标记为对 SQL 操作不可见。随后对该表的插入和更新将在该字段存储一个 NULL 。因此,删除一个字段是很快的,但是它不会立即释放表在磁盘上的空间,因为被删除了的字段占据的空间还没有回收。这些空间将随着现有的行的更新而得到回收。
ALTER TYPE
要求重写整个表的特性有时候是一个优点,因为重写的过程消除了表中没用的空间。比如,要想立刻回收被一个已经删除的字段占据的空间,最快的方法是
ALTER TABLE table ALTER COLUMN anycol TYPE anytype;
这里的 anycol
是任何在表中还存在的字段,而 anytype
是和该字段的原类型一样的类型。这样的结果是在表上没有任何可见的语意的变化,但是这个命令强迫重写,这样就删除了不再使用的数据。
ALTER TYPE
的 USING
选项实际上可以声明涉及该行旧值的任何表达式;也就是说,它可以引用除了正在被转换的字段之外其它的字段。这样,就可以用 ALTER TYPE
语法做非常普遍性的转换。因为这个灵活性,USING
表达式并没有作用于该字段的缺省值(如果有的话);结果可能不是缺省表达式要求的常量表达式。这就意味着如果从旧类型到新类型没有隐含或者赋值转换的话,那么即使存在 USING
子句,ALTER TYPE
也可能无法把缺省值转换成新的类型。在这种情况下,应该用 DROP DEFAULT
先删除缺省,执行 ALTER TYPE
,然后使用 SET DEFAULT
增加一个合适的新缺省值。类似的考虑也适用于涉及该字段的索引和约束。
如果表有任何后代表,那么如果不在后代表上做同样的修改的话,就不允许在父表上增加、重命名、修改一个字段的类型,也就是说,ALTER TABLE ONLY
将被拒绝。这样就保证了后代表总是有和父表匹配的字段。
一个递归 DROP COLUMN
操作将只有在后代表并不从任何其它父表中继承该字段并且从来没有独立定义该字段的时候才能删除一个后代表的字段。一个非递归的 DROP COLUMN
(也就是 ALTER TABLE ONLY ... DROP COLUMN
) 从来不会删除任何后代字段,而是把他们标记为独立定义的(而不是继承的)。
TRIGGER
, CLUSTER
, OWNER
, TABLESPACE
行为绝不会递归到后代表;也就是说,它们的行为就像总是声明了 ONLY
一样。添加一个约束只能在 CHECK
约束上递归。
不允许更改系统表结构的任何部分。
请参考 CREATE TABLE 部分获取更多有效参数的描述。章5里有更多有关继承的信息。
例子
向表中增加一个 varchar
列:
ALTER TABLE distributors ADD COLUMN address varchar(30);
从表中删除一个字段:
ALTER TABLE distributors DROP COLUMN address RESTRICT;
在一个操作中修改两个现有字段的类型:
ALTER TABLE distributors ALTER COLUMN address TYPE varchar(80), ALTER COLUMN name TYPE varchar(100);
使用一个 USING
子句,把一个包含 UNIX 时间戳的 integer 字段转化成 timestamp with time zone
字段:
ALTER TABLE foo ALTER COLUMN foo_timestamp TYPE timestamp with time zone USING timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';
同样地,当字段有一个不会自动转换成新类型的缺省值表达式时:
ALTER TABLE foo ALTER COLUMN foo_timestamp DROP DEFAULT, ALTER COLUMN foo_timestamp TYPE timestamp with time zone USING timestamp with time zone 'epoch' + foo_timestamp * interval '1 second', ALTER COLUMN foo_timestamp SET DEFAULT now();
对现存字段改名:
ALTER TABLE distributors RENAME COLUMN address TO city;
更改现存表的名字:
ALTER TABLE distributors RENAME TO suppliers;
给一个字段增加一个非空约束:
ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
从一个字段里删除一个非空约束:
ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;
给一个表增加一个检查约束:
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
删除一个表及其所有子表的监查约束:
ALTER TABLE distributors DROP CONSTRAINT zipchk;
向表中增加一个外键约束:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) MATCH FULL;
给表增加一个(多字段)唯一约束:
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
给一个表增加一个自动命名的主键约束,要注意的是一个表只能有一个主键:
ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
把表移动到另外一个表空间:
ALTER TABLE distributors SET TABLESPACE fasttablespace;
把表移动到另外一个模式:
ALTER TABLE myschema.distributors SET SCHEMA yourschema;
兼容性
ADD
, DROP
, SET DEFAULT
形式与 SQL 标准兼容。其它形式是 PostgreSQL 对 SQL 标准的扩展。还有,在一个 ALTER TABLE
命令里声明多个操作也是扩展。
ALTER TABLE DROP COLUMN
可以用于删除表中的唯一的一个字段,留下一个零字段的表。这是对 SQL 的扩展,它不允许零字段表。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论