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

SQLite插入数据时ID全部为0的技术问题求助

解决SQLite自增ID插入后数据库显示为0的问题

嘿,这个矛盾的情况我之前也碰到过——内存里的对象ID看起来正常,但数据库里全是0,核心问题肯定是你代码里设置的ID没真正写入数据库,或者插入时传了错误的0值。下面是几个最可能的原因和对应的解决办法:

1. 表结构的自增配置不对

先检查你的alimento表创建语句,SQLite的自增ID有严格要求:

  • ID字段必须是INTEGER PRIMARY KEY(注意是INTEGER,不是INT、BIGINT这些,SQLite对这个类型的识别很严格)
  • 如果需要严格递增不重用已删除的ID,可以加上AUTOINCREMENT,但不加的话SQLite也会自动生成自增的ROWID映射到这个字段

举个错误的表结构例子:

CREATE TABLE alimento (
    id INT PRIMARY KEY, -- 这里用INT就错了
    nome TEXT,
    -- 其他字段...
);

正确的写法应该是:

CREATE TABLE alimento (
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- 或者只写INTEGER PRIMARY KEY
    nome TEXT,
    -- 其他字段...
);

2. 插入时手动传入了0作为ID值

大概率是你插入数据的时候,主动给id字段传了0(比如实体类里ID的默认值是0,插入时没跳过这个字段),哪怕表配置了自增,SQLite也会优先用你传入的0。

比如用JDBC的错误写法:

String insertSql = "INSERT INTO alimento (id, nome) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(insertSql);
pstmt.setInt(1, alimento.getId()); // 这里getId()返回的是初始的0
pstmt.setString(2, alimento.getNome());
pstmt.executeUpdate();

然后你又手动给alimento.setId(id)设置了一个模拟的自增ID,导致内存里显示正常,但数据库里已经写入了0。

正确的做法是不要指定ID字段,让SQLite自动生成,然后把生成的ID取出来设置到对象里:

String insertSql = "INSERT INTO alimento (nome) VALUES (?)"; // 去掉id字段
// 加上Statement.RETURN_GENERATED_KEYS来获取自增ID
PreparedStatement pstmt = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, alimento.getNome());
pstmt.executeUpdate();

// 获取数据库生成的真实ID
ResultSet rs = pstmt.getGeneratedKeys();
if (rs.next()) {
    int realId = rs.getInt(1);
    alimento.setId(realId); // 这时候设置的ID才是数据库里真正的ID
}

3. ORM框架的配置坑(如果用了Room/Hibernate这类)

如果你用了ORM框架,那可能是实体类的ID注解配置错了:

  • 比如Room里,必须给ID字段加@PrimaryKey(autoGenerate = true),而且不要给ID设置默认值0
  • 如果实体类里ID默认是0,框架会把0当作有效值插入,不会触发自增

错误的Room实体类例子:

@Entity(tableName = "alimento")
public class Alimento {
    @PrimaryKey
    private int id = 0; // 默认0会导致插入0
    private String nome;
    // getter/setter...
}

正确的配置:

@Entity(tableName = "alimento")
public class Alimento {
    @PrimaryKey(autoGenerate = true)
    private int id; // 不要设默认值,或者用Integer类型设为null
    private String nome;
    // getter/setter...
}

快速排查步骤

  • 先查alimento表的结构,确保ID是INTEGER PRIMARY KEY
  • 检查插入代码,确认没有手动传0到ID字段,而是让数据库自动生成
  • 如果用ORM,检查实体类的ID注解,确保开启了自增且无默认0值
  • 插入后一定要从数据库获取真实生成的ID,再设置到对象里,别自己模拟自增

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:31:17