我有一张这样的表:
DROP TABLE IF EXISTS `locations`;
CREATE TABLE IF NOT EXISTS `locations` (
`tenant_id` int(11) NOT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
`waypoint_id` int(11) NOT NULL,
`material` int(11),
`price` decimal(10,2) NOT NULL,
PRIMARY KEY (`tenant_id`,`id`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY(`waypoint_id`, `material`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
我正在运行此查询:
UPDATE locations
SET waypoint_id=23,
material=19,
price=22.22,
unit_id=1
WHERE tenant_id=3 AND id = 54;
我收到以下错误:
Duplicate entry '23-19' for key 'waypoint_id'
我知道我已经有了这些ID的记录但是如果它不允许我更改它们怎么能编辑该行中的值?
我不明白为什么如果我没有尝试使用这些ID 23-19插入新记录,我会收到此错误,但我只是想更新该记录。我该如何解决这个问题?
注意
我道歉,我粘贴了错误的查询,我使用第一个创建错误的查询编辑了查询。
答案 0 :(得分:1)
UNIQUE KEY(`waypoint_id`, `material`)
因此,当您执行具有该约束时,您不能拥有2行,这两行具有相同的组合。所以你不能有两行,23作为waypoint_id,19作为材料,简单如此。
这就是独特的意思。无论您更新还是插入,该组合都必须是唯一的。
<德尔> 因为您无法在一个查询中混合使用2个不同的更新查询。 更新位置 SET waypoint_id = 23 WHERE tenant_id = 3 AND id = 54 查询结束于那里。现在看起来你只有1个更新,但你的语法不对。应该是这样的 更新位置 SET waypoint_id = 23, 材料= 19, 价格= 22.22, UNIT_ID = 1 WHERE tenant_id = 3 AND id = 54 德尔>答案 1 :(得分:1)
您的查询似乎有误。它应该是这样的:
UPDATE locations
SET waypoint_id=23,
material=19,
price=22.22,
unit_id=1
WHERE tenant_id=3 AND id = 54;
修改强>
您需要检查您的表没有将waypoint_id设置为23,将物料设置为19,因为您将其设为唯一。如果已存在任何重复条目,则无法添加23值和19值。
您可以这样检查:
select waypoint_id, material from locations WHERE tenant_id=3 AND id = 54;
或者更像是
select * from locations where waypoint_id = 23 or material = 19
解决问题的方法是从表中删除唯一键约束
alter table locations drop index waypoint_id ;
alter table locations drop index material ;
然后你可以进行更新
然后在两列的组合上应用唯一键,如下所示:
ALTER TABLE `locations` ADD UNIQUE `unique_index`(`waypoint_id`, `material`);
答案 2 :(得分:0)
由于用户确定他正在更新条件为waypoint_id=23 & material=19
的唯一行,因此查询可能如下所示:
UPDATE locations
SET price=22.22, unit_id=1
WHERE waypoint_id=23 AND material=19 /*(AND tenant_id=3 AND id = 54) - condition not required*/;