SQLite创建SID格式自定义唯一ID时语法报错如何解决
错误原因
- 数据库语法不兼容:你写的
IDENTITY、RIGHT函数、PERSISTED计算列都是SQL Server的专属语法,SQLite完全不支持上述特性,字符串拼接在SQLite中需要用||而不是+,这也是触发+相关报错的直接原因。 - 基础语法错误:字段名和类型之间缺少空格,比如
CON_ID + "INT"拼接后会变成类似idINT的无效字符串,CON_SID和后续的AS之间也缺少空格,都会引发语法解析错误。 - 自增主键写法错误:SQLite的自增主键标准写法是
INTEGER PRIMARY KEY AUTOINCREMENT,不需要加IDENTITY(1,1) NOT NULL声明。
解决方案
SQLite不支持在建表时直接定义动态拼接自增ID的计算列,推荐两种实现方案:
方案1:业务代码生成(逻辑简单,兼容性最好)
先把SID设为普通文本字段,插入数据时在Java层生成指定格式的SID,代码示例:
修正后的建表代码
@Override public void onCreate(SQLiteDatabase db) { String query = "CREATE TABLE " + TBL_Name + " ("+ CON_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+ CON_Name + " TEXT, " + CON_Address + " TEXT, " + CON_BDay + " TEXT, " + CON_Gender + " TEXT, " + CON_Course + " TEXT, " + CON_SID + " TEXT);"; db.execSQL(query); }
插入数据时生成SID
插入记录时拿到返回的自增ID,用String.format补前导零即可:
// 插入其他字段后拿到自增id long id = db.insert(TBL_Name, null, contentValues); // 生成SID0000001格式的编号 String sid = String.format("SID%06d", id); // 把sid更新到对应记录即可
方案2:数据库触发器自动生成(无需修改业务代码)
如果不想在业务层处理SID生成逻辑,可以在建表后新增触发器,插入数据时自动生成SID:
@Override public void onCreate(SQLiteDatabase db) { // 1. 建表语句 String createTableSql = "CREATE TABLE " + TBL_Name + " ("+ CON_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+ CON_Name + " TEXT, " + CON_Address + " TEXT, " + CON_BDay + " TEXT, " + CON_Gender + " TEXT, " + CON_Course + " TEXT, " + CON_SID + " TEXT);"; db.execSQL(createTableSql); // 2. 创建自动生成SID的触发器 String createTriggerSql = "CREATE TRIGGER auto_generate_sid AFTER INSERT ON " + TBL_Name + " FOR EACH ROW BEGIN " + " UPDATE " + TBL_Name + " SET " + CON_SID + " = 'SID' || printf('%06d', NEW." + CON_ID + ") " + " WHERE " + CON_ID + " = NEW." + CON_ID + ";" + " END;"; db.execSQL(createTriggerSql); }
该方案使用SQLite内置的printf函数补前导零,用||做字符串拼接,触发器会在每次插入数据后自动完成SID的赋值操作。
内容的提问来源于stack exchange,提问作者PeterTheGreat
相关产品推荐
相关产品推荐

