【问题标题】:How to alter a table and add onDelete cascade constraint sqlite如何更改表并添加 onDelete 级联约束 sqlite
【发布时间】:2018-09-09 09:54:32
【问题描述】:

我正在使用房间数据库我有一个表格,我忘记在其中添加onDelete = CASCADE

以前的版本

@Entity(indices = {@Index(value = {"info_id"})}, foreignKeys = @ForeignKey(entity = StudentClass.class, parentColumns = "id", childColumns = "info_id"))

我现在想要什么

@Entity(indices = {@Index(value = {"info_id"})}, foreignKeys = @ForeignKey(entity = StudentClass.class, parentColumns = "id", childColumns = "info_id", onDelete = CASCADE))

我正在尝试迁移数据库

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            database.execSQL("What should I do here to add onDelete = CASCADE");
        }
    };

【问题讨论】:

    标签: android sqlite android-room


    【解决方案1】:

    好的,我终于找到了解决方案

    database.execSQL("CREATE TABLE attendance_temp(attendanceId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, time INTEGER NOT NULL, student_id INTEGER, student_name TEXT , roll_number INTEGER, image_path TEXT, info_id INTEGER, present INTEGER , CONSTRAINT fk_class_info FOREIGN KEY (info_id) REFERENCES class_info(id) ON DELETE CASCADE)");
    database.execSQL("INSERT INTO attendance_temp SELECT * FROM Attendance");
    database.execSQL("DROP TABLE Attendance");
    database.execSQL("ALTER TABLE attendance_temp RENAME TO Attendance");
    database.execSQL("CREATE INDEX index_Attendance_info_id ON Attendance(info_id)");
    

    还将实体类中的架构更改为

    @Entity(indices = {@Index(value = {"info_id"})}, foreignKeys = @ForeignKey(entity = StudentClass.class, parentColumns = "id", childColumns = "info_id", onDelete = CASCADE))
    

    顺序很重要。

    【讨论】:

    • 哇,那真是太痛苦了:(
    【解决方案2】:

    SQLite 不完全支持 SQL ALTER TABLE 标准:

    只有 RENAME TABLE、ADD COLUMN 和 RENAME COLUMN 变体 支持 ALTER TABLE 命令。其他种类的 ALTER TABLE DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT 等操作 第四个被省略。

    Source

    所以添加约束的唯一方法是重新创建表并将旧表的数据复制到新表中:

    // 1. Rename your table
    database.execSQL("ALTER TABLE Entity RENAME TO Entity_old")
    // 2. Recreate the same entity, but now with the constraint
    database.execSQL("""
        CREATE TABLE Entity(
            id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
            parentId INTEGER, 
            someField STRING, 
            CONSTRAINT fk_Entity_entityId_EntityParent_id FOREIGN KEY (entityId) REFERENCES EntityParent(id) ON DELETE CASCADE
        )
    """)
    // 3. Copy the data from the old table
    database.execSQL("INSERT INTO Entity SELECT * FROM Entity_old")
    // 4. Delete old table
    database.execSQL("DROP TABLE Entity_old")
    // 5. Recreate the indices
    database.execSQL("CREATE INDEX index_Entity_id ON Entity(id)")
    

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      相关资源
      最近更新 更多