snowflake - 将数据类型从 VARCHAR(16777216) 修改为 NUMBER

问题描述 投票:0回答:2

我需要将雪花中的 VARCHAR(16777216) 类型修改为 NUMBER 。

ALTER TABLE [TABLE_NAME] ALTER [COLUMN_NAME] 设置数据类型为 NUMBER; 返回:SQL 编译错误:无法将列 [COLUMN_NAME] 从类型 VARCHAR(16777216) 更改为 NUMBER(38,0)

还有 ALTER TABLE [TABLE_NAME] ALTER [COLUMN_NAME] 设置数据类型 VARCHAR(500); 返回:SQL 编译错误:无法将列 [COLUMN_NAME] 从类型 VARCHAR(16777216) 更改为 VARCHAR(500),因为不支持减少 varchar 的字节长度。

(我知道我可以向表中添加一个新列,然后更新它并删除旧列,但我想将该列保留在其顺序位置而不是移动到最后一列,
我也知道我可以使用新数据类型创建新表,然后将数据插入其中,但是有很多数据,而且我需要在多个表上进行此更改..所以我更愿意避免这种解决方案)

有简单的方法吗?

谢谢

snowflake-cloud-data-platform snowflake-schema
2个回答
1
投票

我不确定你是否意识到这一点,但在 Snowflake 中,创建新表与复制数据和更改数据类型之间没有太大区别。 Snowflake 用于存储数据的数据库文件无法更新,因此任何数据更新都会导致创建一个包含数据的新文件(如果该文件中有超过 1 条记录,则意味着数据将在 2 个文件之间拆分,从而导致性能下降) )

因此,实际上并没有一种“简单”的方法,因为如果您尝试更改数据类型,您能想到的任何事情都将导致整个表的检修。


0
投票

您要找的东西在这里:@Nadav

更新了您正在尝试执行的操作的示例。

ALTER TABLE <TABLE_NAME> ADD COLUMN    <COLUMN_NAME_TEMP> NUMERIC(38, 0);
UPDATE      <TABLE_NAME> SET           <COLUMN_NAME_TEMP> = <ORIGINAL_COLUMN_NAME>::NUMERIC(38, 0);
ALTER TABLE <TABLE_NAME> DROP COLUMN   <ORIGINAL_COLUMN_NAME>;
ALTER TABLE <TABLE_NAME> RENAME COLUMN <COLUMN_NAME_TEMP> to <ORIGINAL_COLUMN_NAME>;

原因来自这里:@David Garrison

不幸的是,这种数据类型更改是不允许的,通常最好的选择是

  1. 添加具有临时名称和新数据类型的新列
  2. 运行更新语句将新列设置为旧列的值(进行任何所需的转换)
  3. 重命名列,并根据需要删除旧列。

有时,在克隆或 CTAS 表中执行此更改,然后执行 ALTER TABLE SWAP WITH 也是最简单的。

请注意,像这样的全表更新确实意味着重新创建微分区,这通常是可以的(如果有点慢),但您可能需要留意这是否会影响您的集群。这在 CTAS 方法中更容易控制,因为您可以在 ORDER BY 子句中显式维护顺序。

© www.soinside.com 2019 - 2024. All rights reserved.