2

私は次の問題を抱えています。、、、などidの列を持つテーブルがあります。唯一の一意のキーは、自動インクリメントintである主キーです。はユニークではありません。track_idartist_idtitleidtrack_id

titleそのため、特定のレコードを更新する必要がある状況が発生しtrack_idます。そのようなレコードが存在しない場合は、新しいレコードを作成する必要があります。REPLACEINTOまたはINSERT...ON DUPLICATE KEYは、一意のキーまたは主キーで動作するため、使用できません。また、これを使用するシステムでは、これらのタイプのアクションを1つのクエリで完了する必要があるため、複数のクエリを使用することはできません。そのクエリは必要に応じて複雑になる可能性がありますが、すべてが1つのクエリに含まれている必要があります。

これはどのように行うことができますか?

4

2 に答える 2

2

次の 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;

これらのうちの 1 つだけが効果があります。最初のものは、行がある場合にのみ実行されます。2 番目は、行がない場合にのみ実行されます。

于 2012-07-12T13:02:41.470 に答える
1

あなたはただアップサートをしたいだけです。存在しない場合は挿入し、存在する場合は更新します。複数のクエリをサポートしていないため、Androidでそれを行う方法はありません。

この種のことへの私のアプローチは次のとおりselect track_id from ... where track_id=THE_IDです。その場合resultCursor.getCount()!=0は行が存在するためupdate、そうでない場合はinsert

時間に関しては、sqliteデータベースの単一のスカラーは非常に高速です。

于 2012-07-12T12:58:02.740 に答える