删除数据库中与同步数据冗余的数据(多对多)

组合潮涌
• 阅读 1643

思路

  1. 先获取冗余的数据
  2. 从关联的中间表删除
  3. 删除出冗余的数据
如果不删除中间表的数据,数据库中有外键,不能删除冗余数据
 private void deleteSurplusHosts(List<Host> hostList) {
        List<Host> hosts = hostService.getAll();
        List<HostGroup> hostGroupList = hostGroupService.getAllGroups();
        List<Host> deletedHostList = new ArrayList<>();

        logger.debug("判断获取的计算机不为空");
        if (hosts.isEmpty()) {
            return;
        }

        logger.debug("获取移除的计算机");
        for (Host host : hosts) {
            if (!hostList.contains(host)) {
                deletedHostList.add(host);
            }
        }

        logger.debug("删除关联的中间表");
        for (HostGroup hostGroup : hostGroupList) {
            hostGroup.getHostList().removeIf((host) -> deletedHostList.contains(host));
        }
        hostGroupRepository.saveAll(hostGroupList);

        logger.debug("删除计算机");
        hostRepository.deleteInBatch(deletedHostList);
    }
思路清晰其实并不难,主要学习了一下Java中的containsremoveIf

contains

  • 描述

从数据库中查询出满足一系列条件的记录,然后以对象的形式封装到List中去。此时假设有两个条件AB,满足A的记录集和为ListA,满足B的记录集合为ListB,现在要将ListAListB合并为一个List,注意ListAListB中可能有重复的记录(因为可能某条记录即满足条件A又满足条件B),要过滤掉重复的记录。

俩个对象的属性相等,但俩个对象不应定相等。可能不在一块内存,所以需要重写hashCode()equals()
  • 重写hashCode()equals()

删除数据库中与同步数据冗余的数据(多对多)

删除数据库中与同步数据冗余的数据(多对多)

 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Host host = (Host) o;

        if (context != host.context) return false;
        return name != null ? name.equals(host.name) : host.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + context;
        return result;
    }
重写hashCode()equals()方法,如果name相同,俩个对象就相同;(上述代码`idea`可自动生成)。

removeIf

  • 描述

删除集合中符合条件的成员,empty集合也可以,但是null就炸啦。

  • 例如
private static void removeIfTest() {
        List<String> list = Lists.newArrayList("1","12","13","14","15","0");
        System.out.println("初始时:"+ list.toString());
        list.removeIf(s -> s.contains("1"));
        System.out.println("过滤完:" + list.toString());
        }

删除数据库中与同步数据冗余的数据(多对多)

和过滤filter用法有点相似

循环依赖

最后在启动项目时,使用构造函数注入@Autowired出现了循环依赖

删除数据库中与同步数据冗余的数据(多对多)

解决:必需俩边都从构造函数中拿出来,单独注入

关于循环依赖在组长的思否中有详细介绍Spring Bean 循环依赖

总结

总结、总结也没什么好说的,就是自己又学到了新知识,又成长了,在此多谢有张喜硕组长给我讲解containsremoveIf

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
SQL 删除外键列
一 SQL删除列的语句是:altertabletableNamedropcolumncolumnName(其中,tableName为表名,columnName为列名)但是,如果某列有约束时,不能直接删除,需要先删除约束,再删除列。如果某个列是外键,在不知道外键约束名称的情况下,那么首先是查找外键约束名称,根据名称删除约束,
Wesley13 Wesley13
3年前
MySQL 常用命令手册 增删改查大法
一、数据库操作创建数据库语法:CREATEDATABASEdatabase_name;删除数据库删除数据库务必谨慎!因为执行删除命令后,所有数据将消失。语法:DROPDATABASEdatabase_name;选择数据库语法:
Stella981 Stella981
3年前
Python批量删除mysql中千万级大量数据
场景描述线上mysql数据库里面有张表保存有每天的统计结果,每天有1千多万条,这是我们意想不到的,统计结果咋有这么多。运维找过来,磁盘占了200G,最后问了运营,可以只保留最近3天的,前面的数据,只能删了。删,怎么删?因为这是线上数据库,里面存放有很多其它数据表,如果直接删除这张表的数据,肯定不行,可能会对其它表有影响。尝试每次只删除
Stella981 Stella981
3年前
Redis数据库常用操作
keys\  查询全部keysabc\  模糊查询flushdb  删除当前数据库中的全部数据flushall  删除全部数据库中的数据setKEYVALUE  设置数据getKey  获取数据setuser{name:smith,age:10}  设置json结构setnxKEYVALUE  设置不重复s
Wesley13 Wesley13
3年前
MySQL 常用命令
假如新建数据库lily创建数据库 createdatabaselily; 显示所有数据库 showdatabases;选择数据库 uselily;删除数据库dropdatabaselily;删除数据库deletedatabaselily;删除数据表:
Wesley13 Wesley13
3年前
mysql试题
drop,delete与truncate的区别:优先级:droptruncatedeleteTRUNCATE按行删除并不把删除操作记录记入日志保存(不可恢复)DELETE全部删除表内数据并可将删除操作记录在日志中,可以加where字句,可应用于table和viewDROP删除整个表(结构和数据)再插入时自增长id又
Wesley13 Wesley13
3年前
oracle 删除表空间及数据文件方法
oracle11g版本,创建数据库表空间,默认单个数据文件最大为32G,如果数据文件大于32G,可以增加数据文件。\删除空的表空间,但是不包含物理文件droptablespacetablespace\_name;\删除非空表空间,但是不包含物理文件droptablespacetablespace\_namein
Wesley13 Wesley13
3年前
mysql基础(1)
1.常见术语数据库:数据库是一些关联表的集合。.数据表:表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列:一列(数据元素)包含了相同的数据,例如邮政编码的数据。行:一行(元组,或记录)是一组相关的数据,例如一条用户订阅的数据。冗余:存储两倍数据,冗余可以使系
Wesley13 Wesley13
3年前
MySQL——规范数据库设计
1.1、为什么需要设计当数据库比较复杂的时候,我们就需要设计了糟糕的数据库设计:数据冗余,浪费空间数据库插入和删除都会麻烦、异常【屏蔽使用物理外键】程序的性能差良好的数据库设计:节省内存空间保证数据库的完整性方便我们开发系统软件开发中
陈占占 陈占占
2年前
Django执行迁移命令,MySQL数据库无法生成对应的数据表
Djangomakemigrations可以执行:迁移文件也在:Djangomigrate可以执行:MySQL数据库只能生成系统自带的数据库:原因:models.py文件中的managedFalse,如果设置为False,Django将不会为当前model模型创建或者删除数据库表。解决方法:把managedTrue或者删除managed。