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
相关产品推荐
相关产品推荐

