-1

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

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 专家,但在 an 上抛出一个欺骗错误对update我来说似乎不太直观。
我理解为什么会在 an 上抛出这样的错误INSERT,但是我可以使用一些帮助来弄清楚我做错了什么来解决这个UPDATE问题

4

3 回答 3

0

更新实际上执行两个单独的操作(当然,当条件满足时),一个删除,然后一个插入。您可能需要确保您的 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定义为浮点数的字段上设置字符串值“No Bid”有关。因此,您将0.0000在更新中获得一个值。

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

于 2012-10-23T21:17:20.230 回答
0

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

于 2012-10-23T21:12:16.170 回答
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'

于 2012-10-23T21:12:38.633 回答