代码之家  ›  专栏  ›  技术社区  ›  Augusto Carmo

房间的'onDelete=CASCADE'在迁移期间不工作

  •  0
  • Augusto Carmo  · 技术社区  · 6 年前

    我有以下表格:

    @Entity(
        tableName = "users"
    )
    class Users {
        @PrimaryKey(autoGenerate = true)
        var id: Long? = null
    
        @NonNull
        var name: String? = null
    }
    
    @Entity(
        tableName = "pets",
        foreignKeys = [
            ForeignKey(
                entity = Users::class,
                parentColumns = ["id"],
                childColumns = ["owner_id"],
                onDelete = ForeignKey.CASCADE
            )
        ]
    )
    class Pets {
        @PrimaryKey(autoGenerate = true)
        var id: Long? = null
    
        @NonNull
        var name: String? = null
    
        @ColumnInfo(name = "owner_id")
        var ownerId: Long? = null
    }
    

    当我运行删除所有用户表行的迁移时,pets表不受影响。这些行不会自动删除。

    object Migration_1_2 : Migration(1, 2) {
    
        override fun migrate(database: SupportSQLiteDatabase) {
            database.execSQL("""
                DELETE FROM users
            """)
        }
    }
    

    即使在迁移之前执行以下代码片段,它也不起作用。

    database.execSQL("PRAGMA foreign_keys=ON;");
    

    我该怎么做才能让 onDelete = ForeignKey.CASCADE 工作

    0 回复  |  直到 6 年前
        1
  •  2
  •   Bob Snyder    6 年前

    正如@sergiytikhonov在他的评论中指出的,在迁移函数中启用外键约束没有效果。这是因为 migrations are executed as part of a transaction 和 the pragma is a no-op inside a transaction .

    我看不到任何控制和启用的方法 foreign_keys 在执行迁移之前。我认为你唯一的选择是在迁移过程中明确删除宠物:

    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("""
            DELETE FROM pets WHERE owner_id IN (SELECT id FROM users)
        """)
    
        database.execSQL("""
            DELETE FROM users
        """)
    }
    
    推荐文章