请注意 SET STORAGE 本身并不改变表上的任何东西, 只是设置将来的表操作时,建议使用的策略。 该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型, 方法是重新分析最初提供的表达式。 可选的 altertable USING altertable 子句声明如何从旧的字段值里计算新的字段值; 如果省略,那么缺省的转换就是从旧类型向新类型的赋值转换。
PLAIN 必需用于定长的数值,比如 altertable integer,并且是内联的,不压缩的。 EXTERNAL 用于外部保存,不压缩的数据, altertable 而 EXTENDED 用于外部的压缩数据。 EXTENDED 是大多数支持非 PLAIN 存储的数据之缺省。 使用 EXTERNAL 将令在 text 字段上的子字串操作更快, 付出的代价是增加了存储空间。
altertable: ALTER TABLE 语句
如果用 ADD COLUMN 增加一个字段,那么所有表中现有行都初始化为该字段的缺省值 (如果没有声明 DEFAULT 子句,那么就是 NULL)。 这些形式修改一个字段是否标记为允许 NULL 值或者是拒绝 NULL 值。 如果表在字段中包含非空值,那么你只可以 SET NOT NULL。 altertable 由于使用此方式中增加的新列自动填充NULL值,所以不能为增加的新列指定NOT NULL约束。
ALTER TYPE 的 USING 选项实际上可以声明涉及该行旧值的任何表达式; 也就是说,它可以引用除了正在被转换的字段之外其它的字段。 这样,我们就可以用 ALTER TYPE 语法做非常普遍性的转换。 因为这个灵活性,USING 表达式并没有施用于该字段的缺省值(如果有的话); 结果可能不是缺省表达式要求的常量表达式。 在这种情况下,我们应该用 DROP DEFAULT 先删除缺省, 执行 ALTER TYPE,然后使用 SET DEFAULT 增加一个合适的新缺省。 类似的考虑也适用于涉及该字段的索引和约束。 这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。
altertable: Alter table
RENAME 形式改变一个表(或者一个索引,序列,或者视图)的名字, 或者是表中独立字段的名字。 这里 anycol 是任何在表中还存在的字段,而 anytype 是和该字段的原类型一样的类型。 这样的结果是在表上没有任何可见的语意的变化,但是这个命令强迫重写,这样就删除了不再使用的数据。 这个形式为随后的 ANALYZE 操作设置每字段的统计收集目标(default_statistics_target)。
目标的范围可以在 0 到 1000 之内设置;另外,把他设置为 -1 则表示重新恢复到使用系统缺省的统计目标。 有关 PostgreSQL 查询规划器使用的统计信息的更多信息。 这种形式从表中删除 oid 系统字段。 它和 DROP COLUMN oid RESTRICT 完全相同, 只不过是如果表上已经没有 oid 字段了,那么它不会报告错误。 目前,在表上的约束不要求有唯一的名字,因此可能有多个约束匹配声明的名字。 这样就保证了后代表总是有和父表匹配的字段。
altertable: SQL ALTER TABLE 语法
ALTER TABLE DROP COLUMN 可以用于删除表中的唯一的一个字段, 留下一个零字段的表。 这是对 SQL 的扩展,它不允许零字段表。 除了 RENAME 之外所有动作都可以捆绑再一个多次修改的列表中同时施用。
如果从旧数据类型到新类型没有隐含或者赋值的转换, 那么必须提供一个 USING。 这种形式为一个字段设置或者删除缺省值。 请注意缺省值只应用于随后的 INSERT 命令; 它们不会导致已经在表中的行的数值的修改。 我们也可以为视图创建缺省, 这个时候它们是在视图的 ON INSERT 规则应用之前插入 INSERT 语句中去的。 DROP COLUMN 命令并不是物理上把字段删除, 而只是简单地把它标记为 SQL 操作中不可见的。 随后对该表的插入和更新将在该字段存储一个 NULL。
altertable: Alter table举例
这种形式把表的表空间修改为指定的表空间并且把与表相关的数据文件移动到新的表空间去。 但是他们可以通过额外的 SET TABLESPACE 命令移动。 参阅 CREATE TABLESPACE。 请注意,和这个字段相关的索引和表约束也会被自动删除。 如果任何表之外的对象依赖于这个字段, 你必须说 altertable CASCADE,比如,外键参考,视图等等。 一个递归DROP COLUMN 操作将只有在后代表并不从任何其它父表中继承该字段并且从来没有独立定义该字段的时候才能删除一个后代表的字段。
通过使用本站内容随之而来的风险与本站无关。 提供在一个 ALTER TABLE 里面声明多个修改的主要原因是原先需要的对表的多次扫描和重写可以组合成一个回合。 ALTER TABLE 也可以被用來作其他的改變,例如改變主鍵定義。
altertable: Alter table参数
比如,我们可以在一个命令里增加几个字段和/或修改几个字段的类型。 对于大表,这么做特别有用,因为只需要对该表做一次处理。 Alter table,网络程序及编程中所用的术语。 altertable 通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。 W3School 简体中文版提供的内容仅用于培训和测试,不保证内容的正确性。
- 可选的 USING 子句声明如何从旧的字段值里计算新的字段值; 如果省略,那么缺省的转换就是从旧类型向新类型的赋值转换。
- 这样,我们就可以用 ALTER TYPE 语法做非常普遍性的转换。
- 如果任何表之外的对象依赖于这个字段, 你必须说 CASCADE,比如,外键参考,视图等等。
- 因为这个灵活性,USING 表达式并没有施用于该字段的缺省值(如果有的话); 结果可能不是缺省表达式要求的常量表达式。
- 随后对该表的插入和更新将在该字段存储一个 NULL。
- 类似的考虑也适用于涉及该字段的索引和约束。
- 通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。
因此,删除一个字段是很快的,但是它不会立即缩减你的表在磁盘上的大小,因为被删除了的字段占据的空间还没有回收。 这些空间将随着现有的行的更新而得到回收。 用一个非空缺省增加一个字段或者是改变一个字段的现有类型会要求整个表的重写。 对于大表来说,这个操作可能会花很长时间;并且它还临时需要两倍的磁盘空间。