2012-07-12 75 views
1

我有以下問題。我有一個列表,如id,track_id,artist_idtitle。唯一的唯一鍵是主鍵id,它是一個自動遞增的int。 track_id不是唯一的。INSERT ... ON DUPLICATE KEY - 如何在非主鍵上執行此操作?

所以出現這種情況,我需要更新title作爲特定的記錄track_id。如果不存在這樣的記錄,則應創建新的記錄。我不能使用REPLACE INTO或INSERT ... ON DUPLICATE KEY,因爲它們是以獨特或主鍵操作的。我也不能使用多個查詢,因爲這個系統需要在單個查詢中完成這些類型的操作。該查詢可以根據需要儘可能複雜,但都必須駐留在一個查詢中。

這怎麼辦?

+1

爲什麼不只是使用事務和多個查詢? (除非你使用'MyISAM') – JamesHalsall 2012-07-12 12:53:05

+1

這些系統將公開包裝查詢。這些包裝只能包裝一個查詢,並且封裝包裝調用不是一個選項。 – kmarks2 2012-07-12 12:54:42

+2

我的好朋友看來你是用這個炸的...... – Sebas 2012-07-12 12:56:21

回答

2

順序執行這兩個查詢:

update track set 
title = ? 
where track_id = ?; 

insert into track (nonkey_col_1, nonkey_col_2, ...) 
select 'nonkey_col_1_value', 'nonkey_col_2_value', ... 
from track 
where not exists (select * from track where track_id = ?) 
limit 1; 

這些只有一個會產生什麼影響:如果有一個排的第一隻執行。第二個僅在不是連續時執行。

+0

,那麼這將非常有幫助。不幸的是,我的特定環境的不可變約束條件是它必須在單個查詢中完成。系統公開包裝,但每個包裝只能包含一個查詢。然後,這些包裝將暴露在其他地方,我無法將它們鏈接在一起。 – kmarks2 2012-07-12 13:07:32

+0

@ kmarks2,查詢不需要鏈接在一起。如果您無法添加複合唯一密鑰並使用INSERT .. ON DUPLICATE,則可以使用此解決方案。 – 2012-07-12 13:27:06

1

你只是想做一個upsert。如果不存在則插入,如果存在則更新。因爲它不支持多個查詢,所以無法使用android來完成它。

我對這種事情的態度是:第一個select track_id from ... where track_id=THE_ID。如果resultCursor.getCount()!=0則該行存在,因此您需要update,否則insert

至於那時,sqlite數據庫中的一個標量是非常快的。

相關問題