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

使用SQLite JDBC 3.42.0.0执行UPSERT语句报ON语法错误求助

SQLite UPSERT语句Java执行报错的排查与解决

核心排查点与解决方案

1. 确认目标字段的唯一约束存在

SQLite的ON CONFLICT子句依赖唯一冲突触发条件,如果charge_sets表的name字段未设置UNIQUE约束或PRIMARY KEY,SQLite会直接判定语句为语法错误(这是SQLite的特性,将无效冲突条件视为语法问题)。

  • 验证表结构:执行以下SQL检查name字段的约束:
PRAGMA table_info(charge_sets);

查看结果中name对应的pk(主键)或unique列是否为1。

  • 若缺少约束,添加唯一约束:
ALTER TABLE charge_sets ADD CONSTRAINT unique_charge_set_name UNIQUE(name);

2. 验证Java环境中实际运行的SQLite版本

虽然你使用的sqlite-jdbc版本为3.42.0.0,但环境中可能存在旧版SQLite native库冲突加载的情况。UPSERT语法要求SQLite核心版本≥3.24.0。

  • 在Java代码中执行以下语句确认实际版本:
try (Statement stmt = conn.createStatement()) {
    ResultSet rs = stmt.executeQuery("SELECT sqlite_version();");
    if (rs.next()) {
        System.out.println("实际SQLite版本: " + rs.getString(1));
    }
} catch (SQLException e) {
    e.printStackTrace();
}

若版本低于3.24.0,需清理环境中的旧版依赖,重新引入正确的sqlite-jdbc包。

3. 改用参数化查询(可选但推荐)

硬编码字符串可能存在潜在转义问题,改用参数化查询可避免此类问题,同时提升代码安全性:

String stmtStr = "INSERT INTO charge_sets(name, description, ref_name) VALUES(?, ?, ?) " +
                 "ON CONFLICT(name) DO UPDATE SET description=?, ref_name=?";
PreparedStatement placeStatement = conn.prepareStatement(stmtStr);
placeStatement.setString(1, "test");
placeStatement.setString(2, "test");
placeStatement.setString(3, "test");
placeStatement.setString(4, "test");
placeStatement.setString(5, "test");
placeStatement.executeUpdate();

内容的提问来源于stack exchange,提问作者Extrreme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:07:52