0

我需要更改 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...

-- 复制“保存”表中的数据 UPDATE table_to_change SET column_name1=save_data.column_name1, -- 对于删除/读取的每一列 column_name2=save_date.column_name2, ... FROM save_data WHERE table_to_change.primary_key=save_data.primay_key;

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

4

3 回答 3

2

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

  1. 添加具有临时名称(即:)TMP_COL和新数据类型(即:)的新列CHAR(20
  2. 运行更新查询:UPDATE TBL SET TMP_COL = OLD_COL;
  3. 降低OLD_COL
  4. 重命名TMP_COLOLD_COL
于 2009-11-30T20:20:01.373 回答
1

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

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

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

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

于 2009-11-30T19:59:33.550 回答
1

解决问题的最佳方法是将 pg 升级到不那么陈旧的东西:)

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

于 2009-11-30T20:33:29.427 回答