我有一个无故启动失败的存储过程。那么必须有一个,但我找不到它!
这是我之前多次遵循的过程,没有任何问题。
源服务器工作正常!
我在源服务器上执行数据库的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”的类型为boolean,但expression的类型为integer SQL状态:42804 提示:您需要重写或转换表达式。
为什么我得到这个 - 我上次遵循此过程与此时间之间的唯一区别是,所讨论的表现在添加了一个额外的列,因此“HBA”布尔列不是最后一个字段。但那么为什么它会在原始数据库中运行呢!
我已经尝试删除所有数据,删除和重建表这些都失败了。 但是,如果我删除列并将其添加回来,如果有效 - 是否有关于布尔字段的内容,这意味着它们必须是最后一个字段!
任何帮助都非常适用。
使用Postgres 9.1
答案 0 :(得分: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;
这样的查询导致了转换错误,因为列类型不匹配。