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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:15:06