Postgres修改表以将列类型从char转换为bigint

36
3个回答

102

通过解析字符串(强制类型转换)进行转换:

alter table the_table alter column the_column type bigint using the_column::bigint
事实上,你可以使用任何与 the_column::bigint 有关的表达式来自定义转换,而不是 the_column :: bigint
请注意,这将重新编写表格,在完成之前甚至会锁定读者。

5
太好了!这明显证明了我的答案是错误的,所以我已经将其删除了,并且学到了新东西。 - dezso

6
您可以创建一个临时的bigint类型的列,然后执行以下SQL:
UPDATE my_table SET bigint_column=varchar_column::bigint;

然后删除您的varchar_column并将bigint_column重命名。这有点绕,但不需要在postgres中使用自定义转换。


0

如何在PostgreSQL中将字符串列类型转换为数字或bigint

设计自己的自定义转换,从字符串到bigint。类似于以下内容:

CREATE OR REPLACE FUNCTION convert_to_bigint(v_input text)
RETURNS BIGINT AS $$
DECLARE v_bigint_value BIGINT DEFAULT NULL;
BEGIN
    BEGIN
        v_bigint_value := v_input::BIGINT;
    EXCEPTION WHEN OTHERS THEN
        RAISE NOTICE 'Invalid bigint value: "%".  Returning something else.', v_input;
        RETURN 0;
    END;
RETURN v_bigint_value;
END;

接下来创建一个新表fixed_table_with_bigint,与旧表具有相同的参数,只是将字符串列更改为bigint列。

然后使用自定义转换convert_to_integer将前一张表中的所有行插入到新表中:

insert into fixed_table_with_bigint
select mycolumn1, 
       convert_to_bigint(your_string_bigint_column),
       mycolumn3
    from incorrect_table

你可能需要修改`convert_to_bigint`函数以处理非数字、空字符串、null值、控制字符和其他异常情况。
之后删除第一个表格并将第二个表格重命名为第一个表格。

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