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

SQLite3 AUTO_INCREMENT自增id插入数据报NOT NULL约束失败问题

问题根因

SQLite 的自增主键语法和 MySQL 等其他数据库不通用,你使用的AUTO_INCREMENT关键字(带下划线)SQLite 无法识别,不会为id字段自动生成递增值,因此插入时不传id会触发NOT NULL约束报错,移除约束后id字段就会存入NULL。

SQLite 自增主键的规则非常明确:

  • 字段类型必须为INTEGER
  • 自增逻辑和主键定义强绑定,不存在独立的AUTO_INCREMENT字段属性
  • 若需要严格保证生成的id永不复用历史删除过的值,使用无下划线的AUTOINCREMENT关键字,且必须紧跟在PRIMARY KEY后声明
正确建表写法

两种写法都能实现插入时自动生成id的效果,按需选择即可:

-- 日常开发推荐写法:无需额外关键字,只要声明为INTEGER PRIMARY KEY,SQLite就会自动生成递增id,性能更好
CREATE TABLE history (
    id INTEGER PRIMARY KEY NOT NULL,
    user_id INTEGER NOT NULL,
    symbol TEXT NOT NULL,
    price NUMERIC NOT NULL,
    shares INTEGER NOT NULL,
    timestamp DATETIME NOT NULL,
    type TEXT NOT NULL,
    FOREIGN KEY(user_id) REFERENCES users(id)
);

-- 特殊场景写法:加AUTOINCREMENT(无下划线),保证生成的id是全局从未使用过的,不会复用已删除记录的id
CREATE TABLE history (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    user_id INTEGER NOT NULL,
    symbol TEXT NOT NULL,
    price NUMERIC NOT NULL,
    shares INTEGER NOT NULL,
    timestamp DATETIME NOT NULL,
    type TEXT NOT NULL,
    FOREIGN KEY(user_id) REFERENCES users(id)
);

按上面的语句重新建表后,执行原INSERT语句不需要传入id字段,数据库会自动生成正确的递增id值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:42:28