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

Posted

技术标签:

【中文标题】错误:ER_OPERAND_COLUMNS:操作数应包含 1 列【英文标题】:Error: ER_OPERAND_COLUMNS: Operand should contain 1 column(s) 【发布时间】:2014-11-07 16:33:12 【问题描述】:

我的程序创建一个像这样的表:

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();
  );
;

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

过了一会儿,下面的函数会尝试在数据库中插入值:

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();
    );
;

我收到以下错误:

我以前在运行复杂查询时看到过这个,但是这个看起来很简单......我一定错过了一些非常简单的东西。我检查了这些值,它们看起来都不错。

编辑: 按照 cmets 中的建议,我尝试添加列名,但没有任何改变。我会把它们排除在外,以免阻塞代码。

【问题讨论】:

我不确定它应该是 'null'(字符串)而不是 values.push(['null', ...]) 行中的 null(值)。不过,这应该不会导致问题。 好的,最后一件事 - 你能举例说明p 中的内容吗?更具体地说,您推送的任何属性是原语 - stringnumber,而不是对象? .sizes 属性让我有些困惑,看 - 它看起来像是一个数组。 我的意思是,你能展示一个取自values数组的样本吗? 伙计,你是个摇滚明星,我忘了把它串起来。这值得一票,让它成为一个答案!这也说明了为什么正确命名变量总是可以节省时间。谢谢! 【参考方案1】:

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

在您的情况下,其中一个元素是一个数组 - 它被 node-mysql 查询生成器包装成括号,将 VALUES 行弄乱成类似...

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

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

【讨论】:

感谢您提供额外的知识;)

以上是关于错误:ER_OPERAND_COLUMNS:操作数应包含 1 列的主要内容,如果未能解决你的问题,请参考以下文章

不和谐的python音乐机器人(一元+的错误操作数类型:'dict')错误

类型错误:+ 不支持的操作数类型:“int”和“元素”

错误:二元运算符'&&'的错误操作数类型。这个错误是什么意思?

AWS SAM 部署错误 - 验证错误 | CreateChangeSet 操作错误

LinuxC 文件与目录 打印文件操作错误信息

为啥我会收到不支持的操作数类型错误?