java - 从具有孤立父 ID 的表中删除嵌套行
问题描述
我有一个表,其中parentId
列可以是顶级项目的 0 或属于其他项目的项目的数字。嵌套的深度没有限制。
id parentId title
-------------------------
1 0 Item1
2 1 Item11
3 2 Item22
4 0 Item2
5 4 Item21
我想要的是每次我删除一个项目时,每个孩子和孩子的孩子都会被删除,直到没有项目有一个parentId
不存在的项目。
我知道我可以DELETE
从底部的孩子开始循环遍历记录和查询,但我想知道这是否只能使用 SQLite 命令来完成
解决方案
您可以重新定义表格:
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);
}
现在,当您从表中删除一行时,您删除的行级别以下的所有级别的行也将被删除。
您可能必须从设备上卸载应用程序,以便删除数据库并重新运行以使用新定义重新创建数据库和表。
查看演示。
推荐阅读
- java - 使用 GIT 处理 Java Eclipse 项目的正确方法
- xslt - 对从参考列表中收集的属性进行排序
- can-bus - 如何修复 CAN 连接错误?
- ios - 在搜索栏上键入会破坏布局
- ios - 关于在 swift 中使用 socket.io 在聊天应用程序中发送图像的问题
- javascript - 更新模态引导程序和 ajax
- javascript - JQuery : troubles selecting an html element that is clicked on
- c# - 永久用户设置
- python - InvalidArgumentError:与 Keras LSTM 网络不兼容的形状
- cassandra - Cassandra:使用一个字母作为分片键来减少集群的负载