0

我有一个无缘无故开始失败的存储过程。嗯,一定有,但我找不到!

这是我之前多次遵循的过程,没有问题。

源服务器工作正常!

我正在源服务器上对数据库进行 pg_dump 并将其导入另一台服务器 - 这很好,我可以看到所有数据并进行更新。

然后我在导入的数据库上运行一个存储过程,该过程在具有 2 个相同模式的数据库上执行以下操作 -

For each table in schema1
    Truncate table in schema2
    INSERT  INTO schema2."table" SELECT *  FROM schema1."table" WHERE "Status" in ('A','N');
Next

然而,这给了我一个错误,而以前没有 - 错误是

***错误** *

错误:列“HBA”是布尔类型,但表达式是整数类型 SQL 状态:42804 提示:您需要重写或强制转换表达式。

为什么会出现这个问题 - 我上次执行此过程与这次的唯一区别是,现在有问题的表添加了一个额外的列,因此“HBA”布尔列不是最后一个字段。但是为什么它会在原始数据库中工作!

我试过删除所有数据,删除和重建表,这些都失败了。但是,如果我删除列并将其重新添加到 if 有效 - 布尔字段是否意味着它们需要成为最后一个字段!

任何帮助都非常感激。

使用 Postgres 9.1

4

1 回答 1

0

这里的问题 - 不同模式中的表具有不同的列顺序。

如果您没有明确指定列列表和顺序INSERT INTO table(...)或使用SELECT *- 您依赖于表的列顺序(现在您明白为什么这是一件坏事了)。

你试图做类似的事情

INSERT INTO schema2.table1(id, bool_column, int_column) -- based on the order of columns in schema2.table1
select id, int_column, bool_column -- based on the order of columns in schema1.table1
from schema1.table1;

并且这样的查询由于列类型不匹配而导致转换错误。

于 2013-09-11T15:12:57.810 回答