PostgreSQL修改数据库表的列属性(ALTER语句)

一,修改表
PostgreSQL 提供了一族命令用于修改现有表。 
能够实现:
增长字段,
删除字段,
增长约束,
删除约束,
修改默认值,
重命名字段,
重命名表。
这些操做能够用:ALTER TABLE命令执行的。sql

1,增长字段
要增长一个字段,使用这条命令: 
ALTER TABLE products ADD COLUMN description text;
新增的字段对于表中已经存在的行而言最初将先填充空值。 
你也能够同时在该字段上定义约束,使用一般的语法: 
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
一个新字段不能用非空约束,由于最初的时候该字段必须包含空值。 可是你能够稍后增长一个非空约束。一样,你也不能在一个新字段 上定义默认值。根据 SQL 标准的说明,这样须要对现存行的新 字段填充默认值,而这个特性尚未实现。可是你能够稍后调整 字段预设。express

2,删除字段
除一个字段: 
ALTER TABLE products DROP COLUMN description;函数

3,增长约束
要增长一个约束,使用表约束语法。好比: 
 代码示例:
ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;spa

要增长一个不能写成表约束的非空约束,使用下面语法: 
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;.net

这个约束将当即进行检查,因此表在加入约束以前必须符合约束条件。code

4,删除约束
要删除一个约束,你须要知道它的名字。若是你给了它一个名字, 那么事情就好办了。
不然系统会分配一个生成的名字,这样你就须要 把它找出来了。psql 的命令 \d tablename 在这儿能够帮忙﹔ 
其它接口可能也提供了检查表的细节的方法。
命令: 
ALTER TABLE products DROP CONSTRAINT some_name;
除了非空约束外,全部约束类型都这么用。要删除非空类型,用 
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
(要记得非空约束没有名字。)对象

5,改变默认值
要给一个字段设定默认值,使用一个象下面这样的命令: 
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
要删除默认值,用 
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
这样至关于把预设设定为空,至少在 PostgreSQL里是这样的。 
若是删除一个尚未定义的默认值不算错误,由于预设隐含就是空值。blog

6,给字段更名字
重命名一个字段: 
ALTER TABLE products RENAME COLUMN product_no TO product_number;继承

7,给表更名字
 代码示例:
To rename a table: 
ALTER TABLE products RENAME TO items;递归


Name
ALTER TABLE -- 修改表的定义
Synopsis

ALTER TABLE [ ONLY ] name [ * ]
action [, ... ]
ALTER TABLE [ ONLY ] name [ * ]
RENAME [ COLUMN ] column TO new_column
ALTER TABLE name
RENAME TO new_name
ALTER TABLE name
SET SCHEMA new_schema

这里 action 是下列之一:

ADD [ COLUMN ] column type [ column_constraint [ ... ] ]
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_constraint
DROP CONSTRAINT constraint_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。

SET/DROP DEFAULT
这种形式为一个字段设置或者删除缺省值。请注意缺省值只应用于随后的 INSERT 命令; 它们不会致使已经在表中的行的数值的修改。咱们也能够为视图建立缺省, 这个时候它们是在视图的 ON INSERT 规则应用以前插入 INSERT 语句中去的。

SET/DROP NOT NULL
这些形式修改一个字段是否标记为容许 NULL 值或者是拒绝 NULL 值。 若是表在字段中包含非空值,那么你只能够 SET NOT NULL。

SET STATISTICS
这个形式为随后的 ANALYZE 操做设置每字段的统计收集目标(default_statistics_target)。 目标的范围能够在 0 到 1000 以内设置;另外,把他设置为 -1 则表示从新恢复到使用系统缺省的统计目标。 有关 PostgreSQL 查询规划器使用的统计信息的更多信息, 请参考Section 13.2。

SET STORAGE
这种形式为一个字段设置存储模式。这个设置控制这个字段是内联保存仍是保存在一个附属的表里,以及数据是否要压缩。 PLAIN 必需用于定长的数值,好比 integer,而且是内联的,不压缩的。 MAIN 用于内联,可压缩的数据。 EXTERNAL 用于外部保存,不压缩的数据, 而 EXTENDED 用于外部的压缩数据。 EXTENDED 是大多数支持非 PLAIN 存储的数据之缺省。 使用 EXTERNAL 将令在 text 字段上的子字串操做更快, 付出的代价是增长了存储空间。 请注意 SET STORAGE 自己并不改变表上的任何东西, 只是设置未来的表操做时,建议使用的策略。参阅 Section 50.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 以后再把它们恢复回来。

RENAME
RENAME 形式改变一个表的名字(或者是一个索引,一个序列,或者一个视图)或者是表中一个独立字段的名字。 它对存储的数据没有任何影响。

OWNER
这个形式改变表,序列或者视图的全部者为指定全部者。

SET TABLESPACE
这种形式把表的表空间修改成指定的表空间而且把与表相关的数据文件移动到新的表空间去。 若是在表上呦索引,则不会移动。可是他们能够经过额外的 SET TABLESPACE 命令移动。参阅 CREATE TABLESPACE。

RENAME
RENAME 形式改变一个表(或者一个索引,序列,或者视图)的名字, 或者是表中独立字段的名字。它们对存储的数据没有影响。

SET SCHEMA
这种形式把表移动到另一个模式。相关的索引,约束,以及 SERIAL 字段的序列都跟着移动。

 

除了 RENAME 和 SET SCHEMA 以外全部动做均可以捆绑再一个屡次修改的列表中同时施用。 好比,咱们能够在一个命令里增长几个字段和/或修改几个字段的类型。 对于大表,这么作特别有用,由于只须要对该表作一次处理。

要使用 ALTER TABLE,你必需拥有该表。 要修改一个表的模式,你必须在新的模式上有 CREATE 权限。要修改全部者,你必须仍是新的全部角色的直接或者间接的成员, 而且该角色在该表的模式上必须拥有 CREATE 权限。 (这样的限制就保证了修改全部者这个动做和删除、重建该表能作到的动做没有什么区别。 不过,超级用户能够修改任何表的全部者。)

参数
table
试图更改的现存表(可能有模式修饰)的名称。 若是声明了 ONLY,则只更改该表。 若是没有声明 ONLY,则该表及其全部后表明(若是有)都被更新。 咱们能够在表名字后面附加一个 * 表示后表明都被扫描,可是在目前的版本里,这是缺省行为。 (在7.1以前的版本,ONLY 是缺省的行为。)缺省能够经过改变配置选项 sql_inheritance 来改变。

column
现存或新的字段名称。

new_column
现存字段的新名称。

new_name
表的新名称。

type
新字段的类型,或者现存字段的新类型。

table_constraint
表的新的约束定义。

constraint_name
要删除的现有约束的名字。

trigger_name
要打开或者关闭的单个触发器的名字。

ALL
打开或者关闭属于该表的全部触发器。 (若是这些触发器中有外键约束,那么就要求超级用户权限。)

USER
打开或者关闭全部属于该表的非外键约束触发器。

index_name
要标记为建簇的表上面的索引名字。

CASCADE
自动删除依赖于被依赖字段或者约束的对象(好比,引用该字段的视图)。

RESTRICT
若是字段或者约束还有任何依赖的对象,则拒绝删除该字段。 这是缺省行为。

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 部分获取更多有效参数的描述。 Chapter 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 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 的扩展,它不容许零字段表。--------------------- 做者:killer-leon 来源:CSDN 原文:https://blog.csdn.net/u011627980/article/details/51352559 版权声明:本文为博主原创文章,转载请附上博文连接!

相关文章
相关标签/搜索