MySQL:UPDATE上的Dupe错误

时间:2012-10-23 21:04:52

标签: mysql sql-update

我有一个运行此更新的脚本:

UPDATE `Cq_Item` 
SET     `rfq_item_id` = '9',
    `value` = 'No Bid',
    `datetime_created` = '2012-10-23T20:54:42+00:00',
    `id` = '101' 
WHERE `id` = '101'

反对此表:

CREATE TABLE IF NOT EXISTS `cq_item` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `rfq_item_id` mediumint(8) unsigned NOT NULL,
  `product_id_quoted` mediumint(8) unsigned DEFAULT NULL,
  `quantity` mediumint(6) unsigned DEFAULT '0',
  `value` float(10,4) NOT NULL,
  `datetime_created` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `rfq_item_id` (`rfq_item_id`,`product_id_quoted`,`quantity`,`value`),
  KEY `product_id` (`product_id_quoted`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=102 ;

并且它抛出了这个错误:

  

1062 - 关键'rfq_item_id'重复输入'9-321742-1-0.0000'

当然,我不是SQL大师,但在update上抛出一个欺骗错误对我来说似乎不那么直观了。
我明白为什么会在INSERT上抛出这样的错误,但是我可以帮助找出我做错了什么来实现这个UPDATE:)

3 个答案:

答案 0 :(得分:0)

你的表结构说rfq_item_id是唯一键。并且您在更新查询中设置的值也已在表中。因此,它不允许您使用rfq_item_id ='9'更新查询。

答案 1 :(得分:0)

根据您的表格说明,您有一个unique key

UNIQUE KEY `rfq_item_id` (`rfq_item_id`,`product_id_quoted`,`quantity`,`value`)

您正在尝试使用符合UPDATE条件的值执行UNIQUE KEY

您已有rfq_item_id = '9'value = 'No Bid'的记录,唯一键中其他两列的值也已与id = '101'

中的值匹配

答案 2 :(得分:0)

更新实际上执行两个单独的操作(当然满足条件时),DELETE然后是INSERT。您可能需要确保UPDATE不会导致id = 101的行违反您已经存在的另一行的唯一键。

所以说在尝试更新之前你有两行这样的行

id   |   rfq_item_id |   product_id_quoted  | quantity | value   | datetime_creates
100  |   9           |   9                  |    1     | 0.0000  | <some datetime>
101  |   10          |   9                  |    1     | 0.0000  | <some datetime>

你的UPDATE会抛出你在执行时看到的确切错误,因为rfq_item_id / product_id_quoted / quantity / value唯一键是相同的。

我猜你的问题与尝试在字段value上设置字符串值“无出价”有关,该字段定义为浮点数。因此,您将在更新中获得0.0000值。

同样如对原始问题的评论中所提到的,通常认为错误的SQL实践是尝试在UPDATE语句的WHERE子句中“设置”您正在使用的主键的值。除非确实有理由在更新过程中更改主键。