You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 14:52:28