比如把数据库表journal里的keyword,ekeyword属性改为character(350),原来为character(200),那么我们可以这样操作:psql postgres -c "ALTER TABLE journal ALTER keyword TYPE characte
我们可以用客户端的语句改写,psql
比如把数据库表journal里的keyword,ekeyword属性改为character(350),原来为character(200),那么我们可以这样操作:psql postgres -c "ALTER TABLE journal ALTER keyword TYPE character(350)"psql postgres -c "ALTER TABLE journal ALTER ekeyword TYPE character(350)"好了,修改结束。附ALTER语句的文档。----------------------
Name
ALTER TABLE -- 修改表的定义
Synopsis
ALTER TABLE [ ONLY ] name [ * ] action [, ... ]ALTER TABLE [ ONLY ] name [ * ] RENAME [ COLUMN ] column TO new_columnALTER TABLE name RENAME TO new_nameALTER TABLE name SET SCHEMA new_schema这里 action 是下列之一: ADD [ COLUMN ] column type [ column_c**traint [ ... ] ] DROP [ COLUMN ] column [ RESTRICT | CASCADE ] ALTER [ COLUMN ] column TYPE type [ USING expression ] ALTER [ COLUMN ] column SET DEFAULT expression ALTER [ COLUMN ] column DROP DEFAULT ALTER [ COLUMN ] column { SET | DROP } NOT NULL ALTER [ COLUMN ] column SET STATISTICS integer ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ADD table_c**traint DROP C**TRAINT c**traint_name [ RESTRICT | CASCADE ] DISABLE TRIGGER [ trigger_name | ALL | USER ] ENABLE TRIGGER [ trigger_name | ALL | USER ] CLUSTER ON index_name SET WITHOUT CLUSTER SET WITHOUT OIDS OWNER TO new_owner SET TABLESPACE new_tablespace
描述
ALTER TABLE 变更一个现存表的定义。它有好几种子形式:
ADD COLUMN
这种形式用和 CREATE TABLE 里一样的语法向表中增加一个新的字段。
DROP COLUMN
这种形式从表中删除一个字段。请注意,和这个字段相关的索引和表约束也会被自动删除。 如果任何表之外的对象依赖于这个字段, 你必须说CASCADE,比如,外键参考,视图等等。
ALTER COLUMN TYPE
这种类型改变表中一个字段的类型。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型, 方法是重新分析最初提供的表达式。可选的 USING 子句声明如何从旧的字段值里计算新的字段值; 如果省略,那么缺省的转换就是从旧类型像新类型的赋值转换。如果从旧数据类型到新类型没有隐含或者赋值的转换, 那么必须提供一个 USING。
提供在一个 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 约束上递归。