【问题标题】:Node.js MySQL INSERT ... ON DUPLICATE KEY UPDATE doesn't insert/update more than one rowNode.js MySQL INSERT ... ON DUPLICATE KEY UPDATE 不会插入/更新超过一行
【发布时间】:2020-02-20 00:33:52
【问题描述】:

我在 MariaDB(类似 MySQL 的实现)上有一个数据库,其表如下:

product_qts

  product_id  |    name    |    value  
-----------------------------------------
       1      |     xxs    |      2
       1      |      l     |      1


CREATE TABLE IF NOT EXISTS products_qts (
product_id MEDIUMINT NOT NULL,
name CHAR(50) NOT NULL,
value TINYINT NOT NULL DEFAULT 0,
PRIMARY KEY (product_id, name), 
CONSTRAINT product_qt_fk FOREIGN KEY (product_id)
REFERENCES products(id) ON DELETE CASCADE) ENGINE=INNODB

我将 product_id 和 name 设置为主键。

通过 node.js 后端访问数据库。

因此,当用户想要更新产品时,他会提交新的数量 然后我调用这个函数:

updateQtsById: (qtsArray) => {

    return new Promise(function (resolve, reject) {
        pool.query('INSERT INTO products_qts (product_id, name, value) ' +
                'VALUES ? ' +
                'ON DUPLICATE KEY UPDATE ' +
                'value=VALUES (value) ',
                qtsArray
            )
            .then(result => {
                resolve(result.affectedRows);
            })
            .catch(error => {
                reject(error);
            });
    });
}   

我发给它的参数是这样的:

[ [ 1, 'onesize', 3 ], [ 1, 'xxs', 2 ], [ 1, 'xs', 1 ] ] 

现在它不会出现任何错误,但它不会插入多个值,而是更新第一个值然后停止。我哪里错了?哪种方式最好?

编辑:

product_id 是外键

【问题讨论】:

  • qtsArray 变量的内容是什么?
  • @SlavaRozhnev 对不起,你是对的,就是这样 [ [ 1, 'onesize', 3 ], [ 1, 'xxs', 2 ], [ 1, 'xs', 1 ] ] 我编辑了答案
  • 尝试将id INT AUTO_INCREMENT PRIMARY KEY,添加到表中然后重复相同的操作
  • @flakerimi 但如果 (product_id,name) 重复,我需要它更新,如何实现?
  • 检查这个:mysqltutorial.org/…

标签: mysql node.js mariadb upsert


【解决方案1】:

当您在表中插入新行时,如果该行导致重复 在 UNIQUE 索引或 PRIMARY KEY 中,MySQL 会报错。

但是,如果您在 INSERT 语句中指定 ON DUPLICATE KEY UPDATE 选项,MySQL 将改为使用新值更新现有行。

INSERT ON DUPLICATE KEY UPDATE 语句的语法如下:

INSERT INTO products_qts (product_id, name, value)
VALUES ( 1, 'onesize', 3  )
ON DUPLICATE KEY UPDATE
   name = onesize, 
   value = 3,
   ...;

所有这些都应该在循环中

喜欢

qtsArray.forEach(function(item) { 

 }).

【讨论】:

  • 我无法循环,因为我正在使用 Promise,我需要知道它何时结束。
  • 这种情况下可以使用 Promise.all
猜你喜欢
  • 2017-04-24
  • 2016-08-28
  • 2011-08-09
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 2012-10-06
  • 2018-01-13
  • 2010-11-26
相关资源
最近更新 更多