SQL修改数据库表的列属性(ALTER语句)
关键字: sql修改数据库表的列属性(alter语句)
原文地址: http://hi.baidu.com/kavenhl/blog/item/7c5524958b625d0d7bf48016.html
我们可以用客户端的语句改写,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语句的文档。 ---------------------- NameALTER TABLE -- 修改表的定义SynopsisALTER 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 变更一个现存表的定义。它有好几种子形式:
除了 RENAME 和 SET SCHEMA 之外所有动作都可以捆绑再一个多次修改的列表中同时施用。 比如,我们可以在一个命令里增加几个字段和/或修改几个字段的类型。 对于大表,这么做特别有用,因为只需要对该表做一次处理。 要使用 ALTER TABLE,你必需拥有该表。 要修改一个表的模式,你必须在新的模式上有 CREATE 权限。要修改所有者,你必须还是新的所有角色的直接或者间接的成员, 并且该角色在该表的模式上必须拥有 CREATE 权限。 (这样的限制就保证了修改所有者这个动作和删除、重建该表能做到的动作没有什么区别。 不过,超级用户可以修改任何表的所有者。) 参数
注意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; |