美文网首页
Room 修改表主键

Room 修改表主键

作者: NewNiu | 来源:发表于2021-10-12 14:51 被阅读0次
该篇使用较传统方式来修改表的主键,步骤
  • 在表结构中将原主键删除
  • 添加新主键
  • 升级数据库表
升级数据库表步骤
  • 创建一个新临时表
  • 将旧表中数据复制到临时表
  • 删除旧表
  • 将临时表重命名
之前数据库表结构如下:
@Entity(tableName = "NewsFeedData")
@TypeConverters(StringTypeConverter::class,DateConverters::class)
@Parcelize
data class NewsBeanResponse(
    @PrimaryKey 
    var item_id : String,
    var cover_url : String?,
    var last_time: Date,// 最近插入时间
) : Parcelable
当前升级后的结构如下:
@Entity(tableName = "NewsFeedData")
@TypeConverters(StringTypeConverter::class,DateConverters::class)
@Parcelize
data class NewsBeanResponse(
    // 新增字段id并设置为主键
    @PrimaryKey(autoGenerate = true)
    var id : Int,
    // @PrimaryKey 
    var item_id : String,
    var cover_url : String?,
    var last_time: Date,// 最近插入时间
) : Parcelable
经过将表结构修改过后,我们需要升级数据库版本号:
// version 版本号从1升到2
@Database(entities = [ NewsBeanResponse::class ],version = 2,exportSchema = false)
abstract class DataBase : RoomDatabase() {
    abstract fun getNewsBeanResponseDao() : NewsBeanResponseDao
}
开始迁移
object BrowserDBHelper {
    lateinit var database: DataBase
    fun init(context: Context, name: String) {
        database = Room.databaseBuilder(context, DataBase::class.java, name)
            .addMigrations(MIGRATION_1_2)
            .build()
    }

    private val MIGRATION_1_2: Migration = object : Migration(1, 2) {
        override fun migrate(database: SupportSQLiteDatabase) {
             // 创建一个新表
            database.execSQL("CREATE TABLE `NewsFeedDataTemp` ( `id` INTEGER PRIMARY KEY NOT NULL, `cover_url` TEXT ,`item_id` TEXT NOT NULL, `last_time` INTEGER NOT NULL DEFAULT 0,)")
            // 将旧表中数据复制到新表中
            database.execSQL("INSERT INTO NewsFeedDataTemp (cover_url,item_id,last_time) select  cover_url , item_id , last_time  from NewsFeedData")
            // 删除旧表
            database.execSQL("DROP TABLE NewsFeedData")
            // 将新表生命名为旧表名
            database.execSQL("ALTER TABLE NewsFeedDataTemp RENAME TO NewsFeedData")
        }
    }

至此,修改表主键任务完成。

Room相关

Room 引用复杂数据迁移(Migreate)数据库
Room 数据库版本升级,数据迁移详解

相关文章

  • Room 修改表主键

    该篇使用较传统方式来修改表的主键,步骤在表结构中将原主键删除添加新主键升级数据库表 升级数据库表步骤创建一个新临时...

  • Kudu局限笔记

    结构局限 主键 主键不可修改,如要修改需重新建表 主键必须位于表结构的第一列 主键不可修改数据内容,若要修改必须删...

  • Kudu在使用过程中的各种限制

    主键 表创建后,主键不能修改。必须删除重建表指定新的主键。 主键列必须在非主键列之前 主键列的值不能使用UPDAT...

  • 动态修改字段信息

    修改字段类型、属性: 修改字段名称: 添加主键: 删除主键: 添加唯一: 删除唯一: 修改表名称:

  • SQL学习笔记——一些navicat 操作

    修改表结构 增加字段 主键 批量运行语句

  • 使用pt-online-schema-change 修改主键需注

    场景:某个表上已是联合主键,后来需要修改成 自增长的id 主键。 思路:1.先删除原表的联合主键2.再添加id 列...

  • 数据库修改

    数据库表结构修改(Postgresql) 增加字段 删除限制 修改主键生成方式

  • [MySQL] 删除表的外键

    如果content的主键是content_comment表的外键,则content表的主键类型就不能修改了。删除c...

  • DDL-数据定义语言

    1、库 创建数据库 删除数据库 2、表 创建表 删除表 3、列 增加列 删除列 修改列 4、键 添加主键 删除主键...

  • 表的设置

    插入,修改,删除数据 插入 修改单表 多表 删除 创建,删除表 表的约束 主键 外键 创建表时 关联列必须为key...

网友评论

      本文标题:Room 修改表主键

      本文链接:https://www.haomeiwen.com/subject/wltrmltx.html