2016-12-14 191 views
0

我有一個SQLite數據庫。 在編寫移動行函數時,它將行從一個表移動到另一個表中我需要查詢增加名爲「row」的列,它是INTEGER PRIMARY KEY,但出現錯誤。在我的任務中對行進行索引非常重要。例如,所述疾病是WHERE row >= 2因爲我插入來自其他錶行到位置2SQLite增量整數主鍵和唯一約束衝突

"UPDATE '4' SET row = row + 1 WHERE row >= 2"

Error("19", "Unable to fetch row", "UNIQUE constraint failed: 4.row")

問題的起源WHERE row >= 2"一部分。如何克服這個問題?

回答

1

第一個:'4'不是表名。 UPDATE聲明期望您寫入的表名稱爲'4'。例如:

UPDATE table1 SET row = row + 1 WHERE row >= 2 

二:只要不使用row作爲主鍵(或唯一鍵,對於這個問題),當它顯然不是意味着作爲主鍵,但作爲一個不斷變化的行號。創建一個可以用作該表的主索引的單獨列。

+0

'4'是正確的表名 – KiskaJoe

2

問題的來源WHERE row >= 2"部分。

我傾向於不同意。問題不在於更新了哪些行,它是在訂單中進行更新的。

SQLite很可能會按rowid順序處理行,這幾乎肯定也是row列的遞增順序,因爲該列是自動遞增的PK。那麼假設該表格包含row23的兩行。如果它首先處理第一行,那麼它會嘗試將該行的row值設置爲3,但這會產生約束違規,因爲該列受制於唯一性約束,並且該列中已經有一行值爲3的行。

如何克服這個問題?

不要修改的PK值,特別是不能修改的替代的PK,基本上所有的自動遞增鍵的值。

或者,將行更新到臨時表中,清除原始表,然後將更新後的值複製回臨時表中。如果你有任何FK引用這個PK,這可能會非常混亂,但是,請回到我帶領的「不要修改PK值」的建議。

+0

這對我有用。一個額外的問題。我仍然希望我的「行」列是唯一的。它仍然重新提出這樣的問題。可能問題不在自動增量中。 – KiskaJoe

+0

@KiskaJoe,你是對的,問題不在於自動增量,但你似乎沒有得到主要觀點。 **問題是更新的性質本質上與受影響的列的唯一性約束不兼容。**受影響的表在所有行更新後都滿足約束並不重要(但這就是我的解決方法)。SQLite堅持認爲,在你的查詢所包含的每個行更新之後,該表滿足約束條件,並且有充分的理由期望該要求將失敗*。 –