如何让DuckDB对会导致数据丢失的插入/更新操作抛出错误?
如何让DuckDB在插入/更新导致数据丢失的值时抛出错误?
DuckDB默认会静默处理浮点类型(如REAL/FLOAT4)的精度丢失问题,比如你示例中将30000001存入REAL字段时,因单精度浮点数的精度限制(仅能精确表示2^24以内的整数,即16777216),数值被舍入为30000000而无报错。
要让DuckDB在这类数据丢失/不安全类型转换场景下抛出错误,可开启严格类型检查配置:
方法1:通过SQL命令临时开启
在执行插入/更新操作前,运行以下SQL开启严格类型检查:
SET strict_type_checks = true;
修改你的Node.js代码后示例:
import {DuckDBInstance} from "@duckdb/node-api"; (async () => { const db_instance = await DuckDBInstance.create(":memory:"); const connection = await db_instance.connect(); // 开启严格类型检查 await connection.run("SET strict_type_checks = true;"); await connection.run(` DROP TABLE IF EXISTS "my_data"; CREATE TABLE "my_data" ( "real" REAL, "double" DOUBLE, "integer" INTEGER ); `); // 此时执行插入会抛出错误 try { await connection.run( "INSERT INTO my_data VALUES (30000001, 30000001, 30000001)", ); } catch (err) { console.error("插入错误:", err.message); // 会输出类似:Conversion from INTEGER to REAL would lose data } })();
方法2:初始化实例时全局配置
也可以在创建DuckDB实例时直接指定配置,让严格类型检查全局生效:
const db_instance = await DuckDBInstance.create(":memory:", { config: { strict_type_checks: "true" } });
补充说明
- 该配置不仅针对REAL类型,对所有不安全的类型转换场景(如超出范围的整数转换、高精度数值转低精度类型等)都会触发错误。
- 若需要永久生效,可修改DuckDB的配置文件或启动时添加
--set strict_type_checks=true参数。
内容的提问来源于stack exchange,提问作者Jthorpe
相关产品推荐
相关产品推荐

