今天在对一些抓取到的数据做插入的时候,因为使用了定时器,每间隔几分钟会抓取一次,导致很多数据插入的是重复数据,为了解决这个问题,

一般是在插入之前先通过一个标识去查询表数据看是否已经有了,没有再执行插入操作

一开始我的做法是,执行两次sql语句操作,先select,再insert

let result = await this.app.mysql.select('tb_news_topic', {
where: { order: list.data[i].order }
});
if (!result[0]){
await this.app.mysql.insert('tb_news_topic', {
title: list.data[i].title,
summary: list.data[i].summary,
url: '',
order: list.data[i].order,
publishDate: new Date(list.data[i].publishDate),
createdAt: this.app.mysql.literals.now//当前时间
});
}

以上做法,虽然能实现功能达到目的,但感觉不太优雅,效率比较低,后来了解到mysql支持直接写sql语句做判断,通过查询表数据是否存在,不存在则执行插入操作

    INSERT INTO tb_news_topic(title,summary) SELECT '218',
'XQ33019920170811142528217' FROM DUAL WHERE NOT EXISTS(SELECT *
FROM tb_news_topic WHERE title = '111')

语法

INSERT INTO table(field1, field2, fieldn) SELECT 'field1',
'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS(SELECT field FROM
table WHERE field = ?)

修改代码,改成sql语句直接判断

for (let i = 0; i < list.data.length;i++){
let sql = `INSERT INTO tb_news_topic(title,summary,url,topic_order,publishDate,createdAt) SELECT ?,
?,?,?,?,? FROM DUAL WHERE NOT EXISTS(SELECT *
FROM tb_news_topic WHERE title = ?)`
// 直接执行sql语句
const results = await this.app.mysql.query(sql, [list.data[i].title,
list.data[i].summary,
'',
list.data[i].order,
new Date(list.data[i].publishDate),
this.app.mysql.literals.now,//当前时间
list.data[i].title
]);
}

另外,这里碰到了个问题,通过foreach遍历数组的时候,foreach里面不能使用await ,所在这个地方我用的for循环对数组进行遍历

最新文章

  1. Codeforces #261 D
  2. 苹果IPhone手机由于更新了IOS7 Beta测试版导致“激活出错”后,如何还原电话本和照片方法
  3. docker创建镜像的几个命令
  4. 海蜘蛛WiFiDog固件 MTK7620 OEM,带云AC功能、探针、广告插入,MTK7620解包打包维修默认参数
  5. dedecms _ 栏目无法更新
  6. CSharp SQLServer 登陆
  7. Windows 8本地化多语言支持
  8. SecureCRT-转换密钥-Xshell-配置服务-使用xshell登录远程linux服务器
  9. 《项目架构那点儿事》——浅析web层struts2的构建
  10. hihoCoder_二分&amp;#183;归并排序之逆序对
  11. PHP学习(1)——我为什么要学PHP
  12. 关于新版本,iOS10的相关内容,兼容iOS 10 资料整理笔记
  13. Java读取证书
  14. Python全栈之路----常用模块----subprocess模块
  15. [SCOI2010]幸运数字(容斥+爆搜)
  16. 下载安装 STS(Spring Tool Suite),推荐对应 Eclipse 版本号,适用于Windows32位(xp、2003)
  17. MIT-6.828-JOS-lab5:File system, Spawn and Shell
  18. sql server dba常用概念、操作分析char,varchar,nvarchar,varchar(max)
  19. Centos7安装Chacha20加密算法 (验证成功)
  20. ORA-28056 解决方法

热门文章

  1. [JZOJ3588]【中山市选2014】J语言(表达式解析+栈)
  2. MyBatis(十一) 嵌套结果集的方式,使用collection标签定义关联的集合类型的属性封装规则
  3. input框中修改placeholder的样式
  4. python学习:字典
  5. 使用Ant Design的select组件时placeholder不生效/不起作用的解决办法
  6. ios日期显示NaN
  7. 判断DataTale中判断某个字段中包含某个数据
  8. 反调试——jmp到那个地址
  9. Linux 管理进程
  10. High Availability手册(3): 配置