可能重复:
how to change column datatype from character to numeric in postgresql 8.4
如果我有一个varchar类型的字段(并且所有值都是null或数字的字符串表示),我如何使用alter table将此列类型转换为bigint?
答案 0 :(得分:82)
简单地通过解析字符串(强制转换)进行转换:
alter table the_table alter column the_column type bigint using the_column::bigint
事实上,您可以使用the_column
代替the_column::bigint
的任何表达式来自定义转化。
请注意,这将重写表格,甚至锁定读者,直到完成。
答案 1 :(得分:4)
您可以创建bigint
类型的临时列,然后像
UPDATE my_table SET bigint_column=varchar_column::bigint;
然后删除varchar_column并重命名bigint_column。这有点迂回,但不需要在postgres中进行自定义演员。
答案 2 :(得分:0)
从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
才能处理不是数字,空白字符串,空值,控制字符和其他奇怪的字符串。
然后删除第一个表并将第二个表重命名为第一个表。