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

Android Room中外键onDelete的set_default用法及子行默认值设置疑问

Android Room外键中SET_DEFAULT的用法全解析

嘿,我来帮你把Room里外键SET_DEFAULT的用法说透,包括它的作用、默认值该设在哪,还有实际代码怎么写,咱们一步步来。

首先,SET_DEFAULT到底是干啥的?

当你给子表的外键设置onDelete = ForeignKey.SET_DEFAULT时,父表中被引用的行被删除后,子表中对应行的外键字段会自动被设置为你预先定义好的默认值。

比如你有个Category(分类)父表,和Product(产品)子表,产品关联分类。如果某个分类被删除,你想让属于这个分类的产品自动归到“默认分类”,那SET_DEFAULT就派上用场了。

关键:默认值该设置在何处?

默认值不是在外键注解里设的,而是要在子实体的外键字段上用@ColumnInfo(defaultValue = "...")来指定。这里要注意两个细节:

  • defaultValue的参数是字符串类型,哪怕你的字段是整数,也要用引号包起来(比如defaultValue = "1")
  • 默认值必须满足外键的约束要求:也就是这个默认值必须对应父表中存在的行ID,否则数据库会抛出约束错误(除非你允许外键为null,但那不如直接用SET_NULL了)

实际代码示例

咱们用分类和产品的例子来写具体代码:

1. 定义父实体(Category)

@Entity(tableName = "categories")
data class Category(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val name: String
)

假设咱们预先在这个表里插入一个默认分类,比如id=1,name="默认分类"。

2. 定义子实体(Product)

这里重点看外键字段categoryId的设置:

@Entity(
    tableName = "products",
    foreignKeys = [
        ForeignKey(
            entity = Category::class,
            parentColumns = ["id"],
            childColumns = ["category_id"],
            onDelete = ForeignKey.SET_DEFAULT // 当父行删除时,子行外键设为默认值
        )
    ]
)
data class Product(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val name: String,
    // 这里设置外键字段的默认值为1,对应默认分类的id
    @ColumnInfo(name = "category_id", defaultValue = "1") val categoryId: Int
)

验证效果

当你删除Category表中id=2的分类时,Product表中所有category_id=2的行,它们的category_id会自动被更新为1(也就是咱们设置的默认值),完美实现“产品归到默认分类”的需求。

注意事项

  • 确保父表中存在默认值对应的行:比如上面的例子,你得先往categories表插入id=1的默认分类,否则删除父行时会触发外键约束错误。
  • 如果你的外键字段允许为null,也可以把默认值设为"null",但这种情况其实和SET_NULL效果一致,没必要多此一举。
  • SET_DEFAULT只在父行被删除时触发,父行更新时不会影响子行(如果要处理更新,可以设置onUpdate参数)。

内容的提问来源于stack exchange,提问作者Сергей Загоруйко

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:51:29