2012-03-28 51 views
3

這是事情:如何更新MySQL自然鍵,同時避免重複的外鍵?

我有一個使用jQuery/php/mysql構建的webapp。這是一種任務管理器。我有屬於類別的類別和任務。任務有一個代理主鍵(Autoincrement id)和數據庫一致性我有一個像這樣的自然鍵(唯一):(id_category,position)

當用戶移動任務時,我必須更新位置(ajax請求)這個任務在數據庫中的位置,但也包括所有其他改變所關心的任務的位置。例如,如果您向上移動位置5到位置2的給定任務,位置從4到2的任務必須將其位置增加1。 (這是我的方法;我知道有些人發送給定類別的全部任務與新的職位,但我試圖只更新那些需要的)

問題是我不知道如何在不避免重複錯誤的情況下更新任務的位置,因爲我無法/不知道如何在同一時間更新所有內容。

所以你可以幫助我,或者我應該改變我的方法。我可以刪除唯一索引(自然鍵),但數據庫一致性機制是有一些東西...

謝謝你的任何幫助。

+0

爲什麼當你擁有autoinc鍵時你需要你的自然鍵?它的用途是什麼? – 2012-03-28 18:54:46

+2

在你的例子中,你可以這樣做:'UPDATE table SET position = -1 WHERE position = 5; UPDATE表SET位置=位置+ 1 WHERE位置<5 AND位置> 1; UPDATE表SET位置= 2 WHERE位置= -1'(假設-1是永遠不會使用的位置) – NullUserException 2012-03-28 18:55:08

+0

@TobyAllen用於數據庫一致性。兩個任務不能在同一個類別中處於相同位置。當我構建應用程序時,發生了一些情況,因爲我沒有檢查某些條件。 – Amida 2012-03-28 18:58:25

回答

1
BEGIN TRANSACTION; 
SET UNIQUE_CHECKS=0; 
-- update 1 
-- update 2 
SET UNIQUE_CHECKS=1; 
COMMIT; 

應該這樣做。

+0

我一直在嘗試它,但仍然有重複的錯誤。看起來像SET UNIQUE_CHECKS不起作用。我首先開始在PHP中修改我的查詢,然後嘗試在PHPMyAdmin中播放。 示例: #task與id5位於位置1,ID爲41的任務位於位置2 START TRANSACTION; SET UNIQUE_CHECKS = 0; 更新任務SET位置= 2 WHERE id = 5; 更新任務SET位置= 1 WHERE id = 41; SET UNIQUE_CHECKS = 1; COMMIT; – Amida 2012-03-28 20:57:56

+0

在嘗試在mySQL文檔中查找更多信息後,我只能在您想要導入(插入)大量信息時使用SET UNIQUE_CHECKS = 0。關閉此功能可加速此過程,因爲InnoDb不會檢查唯一性。但是他們沒有說更新使用它,所以也許你的代碼實際上無法工作。你試過了嗎?同時我會嘗試使用NullUserException解決方案。 – Amida 2012-03-28 22:04:59