首页 > 解决方案 > 从具有孤立父 ID 的表中删除嵌套行

问题描述

我有一个表,其中parentId列可以是顶级项目的 0 或属于其他项目的项目的数字。嵌套的深度没有限制。

id     parentId     title
-------------------------
1      0            Item1
2      1            Item11
3      2            Item22
4      0            Item2
5      4            Item21

我想要的是每次我删除一个项目时,每个孩子和孩子的孩子都会被删除,直到没有项目有一个parentId不存在的项目。

我知道我可以DELETE从底部的孩子开始循环遍历记录和查询,但我想知道这是否只能使用 SQLite 命令来完成

标签: javaandroidsqliteandroid-sqlitedelete-row

解决方案


您可以重新定义表格:

CREATE TABLE tablename (
  `id` INTEGER PRIMARY KEY,
  `parentId` INTEGER,
  `title` VARCHAR(6),
  FOREIGN KEY (`parentId`) REFERENCES tablename(`id`) ON DELETE CASCADE
);

以便该列parentId是引用该列的外键,该列id必须是PRIMARY KEY表的列或必须具有UNIQUE索引/约束。

ON DELETE CASCADE操作确保当您删除一行时,所有子行也将被删除(还有子行的子行等)。

此外,0您必须将顶级项目设置为,null这样就不会违反外键约束。

您必须打开键支持,因为默认情况下它是关闭的,这可以在SQLiteOpenHelper'sonConfigure()方法中完成:

@Override
public void onConfigure(SQLiteDatabase db){
    db.setForeignKeyConstraintsEnabled(true);
}

现在,当您从表中删除一行时,您删除的行级别以下的所有级别的行也将被删除。

您可能必须从设备上卸载应用程序,以便删除数据库并重新运行以使用新定义重新创建数据库和表。

查看演示


推荐阅读