mysql数据插入前判断是否存在

今天在对一些抓取到的数据做插入的时候,因为使用了定时器,每间隔几分钟会抓取一次,导致很多数据插入的是重复数据,为了解决这个问题,
一般是在插入之前先通过一个标识去查询表数据看是否已经有了,没有再执行插入操作

一开始我的做法是,执行两次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循环对数组进行遍历

猜你喜欢

转载自www.cnblogs.com/fozero/p/10586117.html