我有一个运行此更新的脚本:
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
:)
答案 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子句中“设置”您正在使用的主键的值。除非确实有理由在更新过程中更改主键。