2016-05-30 66 views
0

我試圖更新包含兩列的表; idpositionid是唯一的,並自動遞增。 position是唯一的,但不會自動增加,實際上必須手動設置。在一個查詢中增加每行中的唯一列

我需要更改所有行的位置大於或等於5(或我提供的任何其他數字)以將它們全部遞增。這是我的代碼:

UPDATE slides 
SET position = position + 1 
WHERE position >= 5; 

不幸的是,它返回以下錯誤:

Error : Duplicate entry '2' for key 'slides_position_unique'

如何更新所有這些獨特的數量,而不會造成衝突,我這樣做?我已經嘗試了一個查詢所有可更新行的子查詢,並將其返回,但它無濟於事。


CREATE TABLE slides 
    (id int(10) unsigned NOT NULL AUTO_INCREMENT, 
    user_id int(10) unsigned NOT NULL, 
    position int(10) unsigned NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE KEY slides_position_unique (position), 
    KEY slides_user_id_foreign (user_id), 
    CONSTRAINT slides_user_id_foreign 
    FOREIGN KEY (user_id) REFERENCES users (id)) 
+0

'show create table'slides'的輸出是什麼? – Asenar

+1

不要將其他信息添加到評論中,而是編輯您的問題並將新信息添加到問題中。這次我爲你做了。請記住這一點在未來。謝謝。 –

回答

3

的問題是在唯一約束 - 在更新過程中的值不是唯一的。你能做到這一點的交易或刪除約束,然後添加:

ALTER TABLE slides DROP index slides_position_unique; 
UPDATE slides SET position = position + 1 WHERE position >= 1; 
ALTER TABLE slides ADD CONSTRAINT slides_position_unique UNIQUE (position); 

的工作示例見http://sqlfiddle.com#!9/66e0d8

+0

耶穌。這是一個很好的觀點,告訴我做奇怪的嵌套的人完全有可能是事實上是錯的。 – Forest

+0

返回相同的錯誤。 – Forest

+0

看看CREATE語句,我看到你在位置上有UNIQUE約束。我認爲UPDATE會在位置列中創建重複項。檢查這個SQL小提琴:http://sqlfiddle.com#!9/fe46ee/1,你可以看到更新按照預期在簡單的輸入數據上工作。 – martin

0

錯誤非常明顯:應用此查詢會產生重複的行。爲了避免改變你的查詢。我想這意味着要麼刪除WHERE position >= 1(更新所有行),要麼添加另一個條件來排除slides.position < 1

也許這更簡單的查詢,爲你的作品:

UPDATE slides 
SET position = position + 1 
WHERE position >= 1 AND position IS NOT NULL 

您可能可能使用UPDATE IGNORE slides set position = position+1但是這可以讓你失去一些行。

+0

這將返回相同的錯誤。我也嘗試過去除WHERE position> = 1',但無濟於事。 – Forest

+0

所以也許你的一些數據是無效的。位置類型='int'和'null'被禁止?我只是編輯了我的答案,以排除無效的位置。否則,如果您確定可能會丟失一些不連貫的數據,您可以嘗試'更新忽略'。 – Asenar

+0

空值被禁止,是的。它只是'int'。我很困惑這個問題。 – Forest

1

您可以在更新中使用訂單。作爲mysql doc事實:

If the ORDER BY clause is specified, the rows are updated in the order that is specified

這將導致:

UPDATE slides 
SET position = position + 1 
WHERE position >= 5 
ORDER BY position DESC; 

這樣你更新了較大的第一,那麼更大的-1,那麼更大的-2等..和獨特的索引在分配到下一行之前總是被釋放。

相關問題