【问题标题】:Vertica error when changing data types更改数据类型时出现 Vertica 错误
【发布时间】:2017-10-11 18:08:34
【问题描述】:

我正在尝试使用以下查询将列从 varchar 转换为 bigint:

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 格式。

【问题讨论】:

  • 似乎是一个数据问题,并且您在某处有一个非整数。尝试 select colname::bigint from tablename (很确定这是 vertica 的有效数据转换语法),如果出错,您在该列中有一个或两个字符。
  • 这样做了吗...没有错误...
  • 可能是 Vertica 的限制...该错误并没有提供太多信息,实际上没有提及冲突的数据类型。联系供应商,Vertica 开发团队可能有比我接下来说的更好的答案。标准解决方法,创建第二个表,其列为 big int,然后将旧表中的所有行批量插入其中。删除旧表,重命名新表。如果您从 vertica 得到更好的答案,请分享。
  • Vertica 支持无济于事...这是他们意识到的限制。回答

标签: sql vertica


【解决方案1】:

无法回答,这对 Vertica 定义不起作用:

https://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/AdministratorsGuide/Tables/ChangingAColumnsDataType.htm

两种方法。

  1. 创建新表、加载新表、删除旧表、重命名新表。

  2. 在表中创建新列。从旧加载列。更改表以删除旧列

【讨论】:

  • 是的...这些是唯一可行的方法。没有可用的直接类型转换
【解决方案2】:

如果你想保留你的桌子,试试:

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 列或 SEGMENTED BY HASH() 列时才有效;您将不得不用另一个超级投影替换这些预测并首先放弃这些预测....

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2016-10-13
    • 2021-11-18
    • 2021-11-21
    相关资源
    最近更新 更多