错误:ER_OPERAND_COLUMNS:操作数应包含1列

时间:2014-09-13 18:13:50

标签: mysql sql node.js

我的程序创建了一个如下表格:

exports.createTablesPhase2= function(tableprefix,cb){
  var s3 = 'CREATE TABLE IF NOT EXISTS productData (
           `id` int NOT NULL AUTO_INCREMENT,
           `url` varchar(255) NOT NULL,
           `baseSite` varchar(255) DEFAULT NULL,
           `img_url` varchar(255) DEFAULT NULL,
           `name` varchar(255) DEFAULT NULL,
           `price` varchar(15) NOT NULL,
           `sale_price` varchar(15) DEFAULT NULL,
           `description` text DEFAULT NULL,
           `extra` varchar(255) DEFAULT NULL,
           `brand` varchar(255) DEFAULT NULL,
           `colors` varchar(255) DEFAULT NULL,
           `sizes` varchar(255) DEFAULT NULL,
           `date` date NOT NULL ,
           PRIMARY KEY `id` (`id`),UNIQUE `url` (`url`));';
  client.query(s3, function(err, result) {
    if (err) throw err;
    cb();
  });
};

这一点有效,我只是把它放在那里让你看到结构。

稍后,以下函数尝试在db:

中插入值
exports.insertProducts = function(products,tableprefix,cb){
    var values = [];
    var date=(new Date()).toISOString().substring(0, 19).replace(/T.*/gi, '');
    for (var i = 0; i < products.length; i++) {
        var p = products[i];
        values.push(['null',p.url,p.baseSite,p.imgUrl,p.name,p.price,p.saleprice,p.description,p.moreInfo,p.brand,p.color,p.sizes,date]);
    }
    console.log(values);
    var sql = "INSERT INTO `productData` VALUES ? 
               ON DUPLICATE KEY UPDATE `price` =  VALUES (`price`),`sale_price` = VALUES (`sale_price`), `date` = VALUES (`date`)";
    client.query(sql,[values],function(err){
        if (err) throw err;
        cb();
    });
};

我收到以下错误:错误:ER_OPERAND_COLUMNS:操作数应包含1列

我在运行复杂查询之前已经看过这个,但这个看起来很简单......我一定很想丢失一些非常简单的东西。我检查了这些值,看起来都很好。

编辑: 根据评论中的建议,我尝试添加列名,但它没有改变任何内容。我会把它们留在外面,不要堵塞代码。

1 个答案:

答案 0 :(得分:7)

如果在INSERT table VALUES ?中使用node-mysql语法进行批量插入,请确保发送到.query()的数组数组具有相应类型的所有值 - 通常作为基元(字符串或数字) )。

在你的情况下,其中一个元素是一个数组 - 它被node-mysql查询构建器包装成了parens,将VALUES行搞砸成类似......

VALUES(null, '123', (123, 456)...)

这会让MySQL抛出令人讨厌的Operand should contain 1 column(s)错误。