尝试将Postgresql列类型从varchar更改为bytea会无限期地挂起

3

我有一个非生产数据库中的表,其中有4行。该表用于开发。有2个varchar列,我想将它们转换为bytea列。我不关心内容,所以当然可以删除这些列,然后再添加回来。但是当我尝试只更改类型时,变得很困惑:

alter table whatever
  alter column col_1 set data type bytea using null,
  alter column col_2 set data type bytea using null;
当我尝试这样做时,psql客户端就会挂起。我的意思是它只是坐在那里没有任何反馈,直到我最终按下^C并中止它。我已经用一个小测试表试过了,它可以正常工作,但出于某种原因,在真实表上却不起作用(实际上,这个真实表也只是一个“小测试表”)。 using从句似乎并没有什么区别;我可以将其省略或给出其他值,命令的效果都一样。 我没有收到错误信息,只是什么都没有得到。这是否符合预期? 我使用的是9.1版本的ubuntu 14.10。

1
如果你将 varchar 转换为 bytea,会发生什么?会产生错误、有意义的结果还是其他什么呢? - Politank-Z
1
底层表有多大?您是否有并发写入负载?要检查表上的锁定,请使用以下命令:SELECT * FROM pg_locks WHERE relation = whatever::regclass; 更多信息请参见:https://wiki.postgresql.org/wiki/Lock_Monitoring - Erwin Brandstetter
@a_horse_with_no_name 那有点说得通;但是为什么它让我将类型更改为 int 呢?好吧,我想我本可以在没有考虑的情况下关闭那个打开数据库的服务器。你的解释很有道理,而且很令人愉悦,因为它不奇怪 :) - Pointy
你可能只是在使用 int 时运气好,没有并发事务干扰。我怀疑你无法再次复现这种效果。 - Erwin Brandstetter
@ErwinBrandstetter 我同意,而且我也不想尝试 :) 谢谢大家;如果你们想输入答案,我会点赞的。 - Pointy
显示剩余6条评论
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2
在这种情况下,这适用于空表:
ALTER TABLE tablename
    ALTER COLUMN colname TYPE bytea USING colname::bytea
;

1
这是不正确的 -- 你应该使用convert_to。请参见https://dev59.com/SGIk5IYBdhLWcg3wadgD。 - Andrew Gaul
来自 OP 的信息:@AndrewGaul:“我不关心内容”。我的建议对我的情况有效,这并不是错误的。如果你能提供更好的答案,请给出。 - YSC
如果您不关心内容,则可以删除并重新添加列,以明确您想要的内容。建议的答案会破坏数据,是危险的。链接的 SO 答案正确地在原地更改了列。 - Andrew Gaul
@ang,看起来你又只读了句子的一部分。"_“这对我在[一个] 表上运行成功。” - YSC

1
简单翻译:

简单:

从pg_locks获取活动锁:

select t.relname,l.locktype,page,virtualtransaction,pid,mode,granted from pg_locks l, pg_stat_all_tables t where l.relation=t.relid order by relation asc;
从上面的结果中复制 pid(例如:14210),并将其替换为下面的命令。
SELECT pg_terminate_backend('14210')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,