2012-07-12 5 views
1

다음과 같은 문제가 있습니다. id, track_id, artist_idtitle과 같은 열이있는 테이블이 있습니다. 유일한 유일한 키는 기본 키, id이며 자동 증가 int입니다. track_id은 고유하지 않습니다.INSERT ... ON DUPLICATE KEY - 비 기본 키에서이를 수행하는 방법?

track_id이있는 레코드에 대해 title을 업데이트해야하는 상황이 발생합니다. 그러한 레코드가 없으면 새로 작성해야합니다. REPLACE INTO 또는 INSERT ...를 사용할 수 없습니다. 중복 키는 고유 키 또는 기본 키로 작동하기 때문에 삽입하십시오. 또한 여러 쿼리를 사용할 수 없기 때문에 이러한 유형의 작업이 단일 쿼리에서 완료되어야합니다. 이 쿼리는 필요한만큼 복잡 할 수 있지만 모두 하나의 쿼리에 있어야합니다.

어떻게이 작업을 수행 할 수 있습니까?

+1

왜 트랜잭션과 여러 쿼리를 사용하지 않는가? (당신이'MyISAM'을 사용하지 않는다면) – JamesHalsall

+1

이것들이 수행 할 시스템은 질의에 래퍼를 노출합니다. 이러한 래퍼는 단일 쿼리 만 래핑 할 수 있으며 래퍼 호출을 함께 연결하는 것은 옵션이 아닙니다. – kmarks2

+2

내 좋은 친구 네가 이걸 가지고 튀긴 것 같아. – Sebas

답변

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

불행히도 제 특정 환경의 불변의 제약은 단일 쿼리에서 수행되어야한다는 것입니다. 시스템은 랩퍼를 노출하지만 각 랩퍼는 단일 u 리만 포함 할 수 있습니다. 그런 다음이 래퍼는 다른 곳에 노출됩니다.이 래퍼는 함께 연결할 수 없습니다. – kmarks2

+0

@ kmarks2의 경우 쿼리를 함께 연결하지 않아도됩니다. 복합 고유 키를 추가 할 수없고 INSERT ... ON DUPLICATE를 사용할 수없는 경우이 솔루션을 사용할 수 있습니다. –

1

업서 트를 수행하기 만하면됩니다. 존재하지 않으면 삽입하고, 존재한다면 업데이트하십시오. 여러 쿼리를 지원하지 않기 때문에 안드로이드로 실행할 수 없습니다.

이런 종류의 문제에 대한 나의 접근 방식은 다음과 같습니다. select track_id from ... where track_id=THE_ID. resultCursor.getCount()!=0 다음 행이 존재하므로 update이 필요합니다. 그렇지 않은 경우 insert입니다.

시간은 sqlite 데이터베이스의 단일 스칼라가 매우 빠릅니다.

관련 문제