阅读 128

koa2+sequelize批量新增如何避免重复

koa2+sequelize批量新增如何避免重复

sequelize提供了批量插入数据的方法:Model.bulkCreate([…object])

let params = [{"name": "张三", "age": 21},{"name": "小李", "age": 20}];

let data = await model.bulkCreate(params);

1

2

以上代码便可以批量在数据库中插入数据,但是默认不会过滤掉重复的内容,比如我这次的数组里已经有张三这个人,下一次我插入数据库中就应该只插入小李而不会再次存入张三。


我们先来看下面这张图:


如上图所示,我们可以用到的方法是updateOnDuplicate


let params = [{"name": "张三", "age": 21},{"name": "小李", "age": 20}];

let data = await model.bulkCreate(params,{

updateOnDuplicate:['name','age']

});

1

2

3

4

这样使用是没有问题的,不过我们在定义数据模型的时候还要在这两个字段加上唯一索引,不然是无效的,如下:


name: {

    type: DataTypes.STRING(128),

    unique: true, //表示唯一的

    allowNull: false, //将 allowNull 设置为 false 将为该列添加 NOT NULL

},

age: {

    type: DataTypes.INTEGER,

    unique: true, //表示唯一的

    allowNull: false, //将 allowNull 设置为 false 将为该列添加 NOT NULL

},

1

2

3

4

5

6

7

8

9

10

如果这样不行,检查下数据库该字段是否已经设置唯一索引,如果可以就不用往下滑了

如上步骤后,很漂亮,我程序还是能多次插入重复数据。


我的以下解决方案,不推荐数据量过大的数据库进行使用

首先我在插入的时候先查一遍数据库是否有该内容,但是数据量过大,每次查询所有,如果mysql是几万条数据,这样肯定是不行的,为了能够更快的运行和查询,使用批量的查询方式,但是得限制一下,数据的批量新增必须控制在一两百条这样子。


let params = [{"name": "张三", "age": 21},{"name": "小李", "age": 20}];


let where = ["张三","小李"];

let ParamsFind = await model.findAll({ //批量查询数据

    attributes:['name','age'],

    where:{

        name:{

            [Op.in]: where

        }

    }

})


for(let item of ParamsFind){ //查到的sql

    for (var i = params .length - 1; i >= 0; i--) { //过滤的数组

        if(params[i].name== item.dataValues.name) {

            params.splice(i, 1);

        }

    }

}

let data = await model.bulkCreate(params);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

如上逻辑,完美的解决了我的问题。。。

如果大家有什么疑问或者更好的解决方案,欢迎留言讨论或加v hua658818

————————————————

版权声明:本文为CSDN博主「__莫等闲」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_31676725/article/details/116082256


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐