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

sequelize提供了批量插入数据的方法:Model.bulkCreate([…object])
let params = [{"name": "张三", "age": 21},{"name": "小李", "age": 20}];
let data = await model.bulkCreate(params);

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

我们先来看下面这张图:

在这里插入图片描述
如上图所示,我们可以用到的方法是updateOnDuplicate

let params = [{"name": "张三", "age": 21},{"name": "小李", "age": 20}];
let data = await model.bulkCreate(params,{
	updateOnDuplicate:['name','age']
});

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

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
},
如果这样不行,检查下数据库该字段是否已经设置唯一索引,如果可以就不用往下滑了

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

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

首先我在插入的时候先查一遍数据库是否有该内容,但是数据量过大,每次查询所有,如果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);
如上逻辑,完美的解决了我的问题。。。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值