我有一个table2
,它有一个由两个列构建的复合主键,其中一个是来自另一个名为table1
的表的外键,另一个名为position
。
该表有第三列,它是来自table3
的外键,如果我遇到重复的键(table1_id
和position
),我想更新它。但是,我得到了标题中提到的错误。下面是table2
的表模式。
CREATE TABLE `table2` (
`table1_id` int NOT NULL,
`table3_id` int NOT NULL,
`position` smallint NOT NULL,
`created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`table1_id`,`position`),
KEY `table1_id` (`table1_id`),
KEY `table3_id` (`table3_id`),
CONSTRAINT `fk_table1_id_1` FOREIGN KEY (`table1_id`) REFERENCES `table1` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_table3_id` FOREIGN KEY (`table3_id`) REFERENCES `table3` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
这是我试图更新的表。当我尝试执行“INSERT INTO ON DUPLICATE KEY UPDATE”语句以更新table3_id时,出现错误“Operand should contain 1 columns(s)”。
我尝试了以下语句:
INSERT INTO `table2`
(`table1_id`, `position`, `table3_id`)
VALUES
(3275027, 1, 5711)
ON DUPLICATE KEY UPDATE
`table3_id` = VALUES(`table3_id`)
table1_id
= 3275027和position
= 1的记录已经存在,我只是想改变table3_id
,但它不会让我。
我希望具有唯一复合主键(3275027,1)(table1_id
,position
)的记录将第三列table3_id
从一个值更新为5711
。
我找了这么多的答案和解释,但我只是不能最终找到一个适当的答案。
编辑1:
我还尝试使用以下命令手动更新列:
UPDATE table2 SET `table3_id` = 5711 WHERE `table1_id` = 3275027 AND position = 1;
但是发生相同的错误。
1条答案
按热度按时间fykwrbwg1#
更新:
我发现我有两个字符串需要连接在一起,放在括号里,没有“CONCAT”关键字来指示调用concat()函数。这是在更新后的触发器中发生的。