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循環對數組進行遍歷


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM