PostgreSQL v7.4 ALTER TABLE更改列

时间:2009-11-30 19:53:42

标签: postgresql alter-table

我需要在PostgreSQL v7.4数据库中更改表中CHAR列的长度。此版本不支持使用ALTER TABLE语句直接更改列类型或大小的功能。因此,例如直接将列从CHAR(10)改为CHAR(20)是不可能的(是的,我知道,“使用varchars”,但在我目前的情况下这不是一个选项)。任何人都有任何建议/技巧如何最好地完成这个?我最初的想法是:

- 将表格的数据保存在新的“保存”表中。 CREATE TABLE save_data AS SELECT * FROM table_to_change;

- 从第一列中删除要更改的列。 ALTER TABLE table_to_change DROP column_name1; - 对于每个列,从第一个需要修改的列开始 ALTER TABLE table_to_change DROP column_name2; ...

- 使用CHAR列的新大小添加列 ALTER TABLE table_to_change ADD column_name1 CHAR(new_size); - 对于上面的每一列 ALTER TABLE table_to_change ADD column_name2 ...

- 从“保存”表中复制数据 更新table_to_change SET column_name1 = save_data.column_name1, - 用于上面删除/重读的每一列     column_name2 = save_date.column_name2, ... 来自save_data 表格_to_change.primary_key = save_data.primay_key;

呸!希望有更好的方法吗?任何建议赞赏。谢谢!

3 个答案:

答案 0 :(得分:2)

不是PostgreSQL,但在Oracle中,我通过以下方式更改了列的类型:

  1. 添加一个带有临时名称的新列(即:TMP_COL)和新数据类型(即:CHAR(20))
  2. 运行更新查询:UPDATE TBL SET TMP_COL = OLD_COL;
  3. 删除OLD_COL
  4. TMP_COL重命名为OLD_COL

答案 1 :(得分:1)

我会将表内容转储到带有COPY的平面文件中,删除表,使用正确的列设置重新创建它,然后重新加载(再次使用COPY)。

http://www.postgresql.org/docs/7.4/static/sql-copy.html

执行此操作时是否可以停机?显然,我刚刚描述的内容要求表格在一段时间内无法使用,需要多长时间取决于您正在使用的数据大小和硬件。

编辑:但是COPY比INSERT和UPDATE快得多。根据文档,您可以通过使用BINARY模式使其更快。 BINARY使其与其他PGSQL安装的兼容性降低,但您不会关心它,因为您只想将数据加载到从中转储的同一个实例。

答案 2 :(得分:1)

解决问题的最佳方法是将pg升级为不太古老的东西:)

严重。 7.4很快就会从“支持的版本”中删除,所以我不会等到7.4在生产中发生。