• 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循环对数组进行遍历

  • 相关阅读:
    数据清洗SQL,一次性的工作
    PGSQL将字段改为不能为空
    C# WINFORM中splitcontainer调整列宽的方法
    【其他】etcd
    正则贪婪匹配
    MarsGIS for Cesium三维地图框架建设方案
    mysql 查询分区表中各个分区的数据量
    推送远程仓库(github/gitlab) 报错:Host key verification failed. fatal: Could not read from remote repository.
    sshkeygen t rsa C xxxx@xxxx.com解释
    DNS、CDN加速和域名解析之间的关系
  • 原文地址:https://www.cnblogs.com/fozero/p/10586117.html
Copyright © 2020-2023  润新知