2017-10-11 151 views
1

我想一列從varchar轉換使用下面的查詢爲bigint:Vertica的錯誤更改數據類型時

ALTER TABLE 'table_name' ALTER COLUMN 'colname' SET DATA TYPE BIGINT; 

,但我得到了以下錯誤:

SQL Error [2377] [0A000]: [Vertica][VJDBC](2377) ROLLBACK: Cannot convert column "colname" from "varchar(128)" to type "int" 
[Vertica][VJDBC](2377) ROLLBACK: Cannot convert column "colname" from "varchar(128)" to type "int" 
com.vertica.util.ServerException: [Vertica][VJDBC](2377) ROLLBACK: Cannot convert column "src_mainuser" from "varchar(128)" to type "int" 

列有int值,如37439510,但採用varchar格式。

+0

看起來像是一個數據問題,你在那裏有一個非整數。嘗試從tablename中選擇colname :: bigint(很確定這是vertica的有效數據轉換語法),如果出錯了,那麼在該列中有一個或兩個字符。 – Twelfth

+0

沒有......沒有錯誤... – anonymous

+0

可能是Vertica的限制......錯誤對信息沒有太大的幫助,沒有提到衝突的數據類型。聯繫供應商,Vertica開發團隊可能會有比我下面所說的更好的答案。標準的解決方法是,創建第二個表,其列的大小爲int,然後將所有行從舊錶中插入到其中。刪除舊錶,重命名新表。如果你從vertica得到更好的答案,請分享。 – Twelfth

回答

1

如果你要保持你的表,請嘗試:

ALTER TABLE table_name ADD COLUMN colname_as_int INT DEFAULT colname::INT;

然後:

ALTER TABLE table_name ALTER COLUMN colname_as_int DROP DEFAULT;

然後:

ALTER TABLE table_name DROP COLUMN colname;

最後:

ALTER TABLE table_name RENAME COLUMN colname_as_int TO colname;

但只適用,如果你有沒有table_name與預測作爲colname一個ORDER BY列或分段BY HASH()欄;你將不得不用另一個超投影來替換那些投影並且首先放下這些投影....