Node.js MySQL INSERT ... ON DUPLICATE KEY UPDATE не вставляет / обновляет более одной строки - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть база данных на 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 и имя в качестве первичных ключей.

Доступ к БД осуществляется через 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 является FOREIGN KEY

1 Ответ

0 голосов
/ 19 февраля 2020

Когда вы вставляете новую строку в таблицу, если строка вызывает дубликат в индексе UNIQUE или PRIMARY KEY, MySQL выдаст ошибку.

Однако, если вы укажете параметр ON DUPLICATE KEY UPDATE в операторе INSERT 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,
   ...;

И все это должно быть в l oop

как

qtsArray.forEach(function(item) { 

 }).
...