我无法更新具有两个唯一键的表

时间:2015-09-25 05:29:23

标签: mysql sql

我有一张这样的表:

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插入新记录,我会收到此错误,但我只是想更新该记录。我该如何解决这个问题?

注意

我道歉,我粘贴了错误的查询,我使用第一个创建错误的查询编辑了查询。

3 个答案:

答案 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*/;