SQLite添加主键时INSERT+SELECT同类型字段出现数据类型不匹配问题
问题原因分析
- 该报错几乎不可能是DbBrowser for SQLite的执行导致,根因出在数据本身的类型不匹配,和客户端工具无关
- 你早期执行的插入语句
INSERT INTO cities (id, name) VALUES ('pan', 'doul');中,给声明为INTEGER类型的id字段传入了字符串值'pan',SQLite默认的动态类型机制不会对此做强校验,所以该条数据可以正常写入旧表。重命名为old_cities后,这条数据的id字段实际存储类型为TEXT,和字段声明的INTEGER不一致。 - 新创建的cities表将id设为INTEGER类型主键,SQLite对
INTEGER PRIMARY KEY字段有特殊的强类型约束,仅支持存储整数类型值,写入字符串类型的'pan'时自然触发类型不匹配错误。
修复方案
- 测试场景下直接删除old_cities中的
id = 'pan'脏数据,再执行插入即可完成迁移 - 业务场景下先统一将old_cities中所有id字段值转换为整数类型,确认无异常后再执行插入操作
验证方法:你可以直接使用sqlite3原生命令行工具执行相同的SQL脚本,会得到完全一致的类型不匹配报错,可排除客户端工具问题。
内容的提问来源于stack exchange,提问作者onlyf
相关产品推荐
相关产品推荐

