2012-10-23 59 views
-1

杜佩錯誤我有運行此更新的腳本:的MySQL:在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 - Duplicate entry '9-321742-1-0.0000' for key 'rfq_item_id'

當然,我不是SQL大師,但在update上投擲一個重複錯誤似乎有點不直觀。
我明白爲什麼這樣的錯誤會得到上INSERT拋出,但我可以使用一些幫助搞清楚什麼我做錯了,以獲取有關該UPDATE :)

+1

僅僅從你的錯誤描述看來,對於我來說,在索引'rfq_item_id'中包含的字段中有相同值的另一條記錄是非常明顯的。檢查您的數據...如果您的條目中包含的數據與您嘗試更新的數據相同,那麼您將無法執行更新(因爲它會違反唯一的關鍵規則)。順便說一句,你不需要再次設置'id' ...它的值不會改變 – Barranka

+0

@Barranka對我來說,這似乎也很明顯,已經有一條匹配這些獨特約束條件的記錄......感謝善良的人,如@邁克布蘭特,他們可以通過分享更多信息來幫助他們......(順便說一句,你是正確的,'ID'字段是不需要的SQL,但業務邏輯取決於它,所以我會讓時間深入,看看可以做什麼。) – mOrloff

回答

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> 

您的更新將拋出你在執行時看到確切的錯誤,因爲rfq_item_id/product_id_quoted /數量/價值唯一的密鑰將是相同。

我猜你的問題是關於試圖設置字段值爲「No Bid」value這是定義爲一個浮動。因此,您將在更新中獲得0.0000值。

同樣正如在原始問題的評論中提到的,它通常被認爲是錯誤的SQL練習,試圖「設置」您在UPDATE語句的WHERE子句中使用的主鍵的值。這是除非真的有理由更改主鍵作爲更新的一部分。

+0

完美的答案... 謝謝!我沒有意識到'UPDATE'實際上是一個兩步過程。啓發是非常感謝:D ...而且,當我有機會時,我會看看我正在使用的biz邏輯,並將其擴展到從更新中排除PK。 – mOrloff

0

你的表結構說rfq_item_id是唯一的關鍵。並且您在更新查詢中設置的值已經在表中。所以,它不允許你用rfq_item_id ='9'更新查詢。

0

根據您的描述表,你有一個​​:

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

您正試圖與已經滿足了你UNIQUE KEY的標準值執行UPDATE

您已經具有rfq_item_id = '9'value = 'No Bid'的記錄,在唯一鍵其他兩列的值也已經在id = '101'