MySQL 在 NodeJS 中的重复键更新

Posted

技术标签:

【中文标题】MySQL 在 NodeJS 中的重复键更新【英文标题】:MySQL ON DUPLICATE KEY UPDATE in NodeJS 【发布时间】:2021-09-17 02:40:11 【问题描述】:

我将 NodeJS 与 mysql 和 async/await 语句一起使用。我在名为 audioid 的 MySQL 表中有一个 UNIQUE 列。

我需要检查是否存在音频。如果是这样,我需要更新一行。如果不是,我需要插入一行。我正在使用 MySQL 的所以这里是查询;

 try 


  if(tag1) 

    row_b = await db.query( "SELECT tagid FROM tags WHERE tagname = ?", [tag1]);    

  if (row_b > 0)   
    
    const tagid1 = row_b[0].tagid;
    console.log('tagid first = ' + tagid1);        
    row_c = await db.query(
   "INSERT INTO entitytag (tagid1) VALUES (?) WHERE audioid = ? 
    ON DUPLICATE KEY UPDATE tagid1 = ?", [tagid1, audioid, tagid1]
                           );
                   
    else   
    row_d = await db.query( 'INSERT IGNORE INTO tags (tagname) VALUES (?)', [tag1]);            
    const tagid1 = row_d.insertId;
     console.log('tagid 2nd = ' + tagid1);         
    row_e = await db.query(
    "INSERT INTO entitytag (tagid1) VALUES (?) WHERE audioid = ? 
    ON DUPLICATE KEY UPDATE tagid1 = ?", [tagid1, audioid, tagid1]
                          );
           
        
    console.log('success!');
    res.json('success!');                       
           
  

但是控制台出现错误;

[ RowDataPacket tagid: 11 ] 第二个标签 = 0 ER_PARSE_ERROR:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“WHERE audioid = 26 ON DUPLICATE KEY UPDATE tagid1 = 0”附近使用正确的语法

【问题讨论】:

@lelio-faieta cmets 和关于ON DUPLICATE KEY UPDATE 查询的答案是正确的。根据您的示例代码,您的目标似乎是维护相关表的键值。您还可以考虑利用foreign keys and referential actions、tablet riggers、存储过程或这些选项的任意组合。它们可能会为您节省一些时间和资源,具体取决于您在此特定情况下的架构和吞吐量。 【参考方案1】:
INSERT INTO entitytag (tagid1) VALUES (?) WHERE audioid = ? 
ON DUPLICATE KEY UPDATE tagid1 = ?

在 SQL 基础上是错误的,因为 insert 创建了一个新行,因此没有 WHERE 条件适用。如果您想指定应在 audioid 上进行重复检查,那么您应该在该字段上使用 UNIQUE 属性的表上创建一个索引。

正确的查询(仅从语法的角度来看)是

INSERT INTO entitytag (tagid1) VALUES (?) 
ON DUPLICATE KEY UPDATE tagid1 = ?

如果没有样本数据、预期结果和表结构,这只是猜测的问题,但工作(功能)查询可能是:

INSERT INTO entitytag (tagid1, audioid) VALUES (?,?) 
ON DUPLICATE KEY UPDATE tagid1 = ?

【讨论】:

这必须有效,因为错误现在已挂起; [ RowDataPacket tagid: 11 ] row_d = [object Object] 无法读取未定义的属性“tagid” 这是您传递给查询的数据问题,而不是 sql 语法问题,这是一个完全不同的问题 知道如何访问最后一个 insertId 吗? 请参阅this SO question 唯一的问题是我没有使用通常的函数(错误,结果)回调。相反,我正在使用 row_a await。

以上是关于MySQL 在 NodeJS 中的重复键更新的主要内容,如果未能解决你的问题,请参考以下文章

从 MySQL 中的“重复键更新”获取动态值

如何使用 mysql 数据库中的 nodejs 和 socket.io 在网页上获得实时更新?

NodeJS通过键的值在数组中查找对象[重复]

插入批处理,如果在Codeigniter 3 HMVC中有重复的密钥更新

nodejs函数中的返回值[重复]

mysql主键重复则更新,不重复则插入