删除异常行后仍无法修改DuckDB表列数据类型的问题
问题原因与解决方案
问题原因
- DuckDB默认采用逻辑删除机制:执行
DELETE语句后,目标行仅被标记为删除状态,不会立即从磁盘的数据页中移除。 - 执行
ALTER TABLE ... ALTER COLUMN ... TYPE时,DuckDB会扫描表的所有数据页(包括含已标记删除行的旧数据页),触发对旧行中'Junk'字符串的类型转换,从而抛出ConversionException。 - 复制表(
CREATE TABLE test2 AS SELECT * FROM original_table)时,仅复制当前活跃的未删除行,新表无包含'Junk'的旧数据,因此修改类型操作可正常执行。
替代解决方案(无需复制表)
不需要必须复制表,执行VACUUM命令即可解决:
- 执行
VACUUM original_table;—— 该命令会物理清理表中所有标记为删除的行,彻底移除含'Junk'的旧数据页。 - 再执行
ALTER TABLE original_table ALTER COLUMN Col1 TYPE INTEGER;,即可成功修改列类型。
注意:DuckDB默认配置下VACUUM会自动回收空间,针对单个表执行VACUUM table_name可精准清理目标表的无效数据。
内容的提问来源于stack exchange,提问作者PJJP
相关产品推荐
相关产品推荐

