Postgres Alter表将列类型从char转换为bigint

时间:2012-12-10 21:01:10

标签: postgresql

  

可能重复:
  how to change column datatype from character to numeric in postgresql 8.4

如果我有一个varchar类型的字段(并且所有值都是null或数字的字符串表示),我如何使用alter table将此列类型转换为bigint?

3 个答案:

答案 0 :(得分:82)

简单地通过解析字符串(强制转换)进行转换:

alter table the_table alter column the_column type bigint using the_column::bigint

事实上,您可以使用the_column代替the_column::bigint的任何表达式来自定义转化。

请注意,这将重写表格,甚至锁定读者,直到完成。

答案 1 :(得分:4)

您可以创建bigint类型的临时列,然后像

一样执行SQL
UPDATE my_table SET bigint_column=varchar_column::bigint;

然后删除varchar_column并重命名bigint_column。这有点迂回,但不需要在postgres中进行自定义演员。

答案 2 :(得分:0)

如何在postgresql

中将字符串列类型转换为numeric或bigint

从string到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才能处理不是数字,空白字符串,空值,控制字符和其他奇怪的字符串。

然后删除第一个表并将第二个表重命名为第一个表。