2012-04-14 4 views
2

일부 데이터의 최신 N 항목을 저장하려는 sqlite 데이터베이스 (안드로이드 기반)가 있습니다.테이블에 최신 n 개의 항목 유지

테이블의 기본 키는 날짜 필드입니다. 기본적으로 임계 값에 도달 한 후 일부 행을 삽입 할 때마다 테이블에서 가장 오래된 항목을 삭제하려고합니다.

이렇게하는 데 특히 영리하고 좋은 방법이 있습니까? 각 삽입 후에 항상 불변 (nr 행 < = THRESHOLD)을 확인하므로 가장 오래된 항목을 삭제하는 것과는 아무런 관련이 없습니다.

는 내가 뭘 계획하고있어 기본적으로 :

  1. 삽입 데이터
  2. 경우 테이블의 수 (*) < = 한계 : 고토 4
  3. 날짜 ==가 (SELECT WHERE 테이블에서 삭제 날짜 별 테이블 순서의 날짜 ASC LIMIT 1);
  4. 내가 ORMlite을 사용하고

참고 일을하지만 난 그냥 원시 SQL을 사용하여 관련 사용자 데이터가 없다, 그래서 문제가 안 때문이다.

+0

단일 값 부속 조회 규칙을 위반하지 않습니까? 3.DELETE FROM 테이블 WHERE date == (ASC 날짜 별 테이블 순서에서 날짜 선택); –

+0

@Chris 적어도 거기에 1이 있어야합니다. 그러나 그것은 의사 코드로 간주되어야합니다. 저는 여전히 최선을 구현하는 방법에 대해 생각하고 있습니다. 단지 일부 코드가 이해하기 쉽게 만들 것이라고 생각했습니다. – Voo

답변

1

새 행이 추가되고 행 수가 임계 값을 초과하면 트리거를 사용하여 가장 오래된 행을 삭제할 수 있습니다.

모든 삽입에 COUNT를 피하기 위해 행 수를 별도의 계정 테이블에 보관할 수 있습니다. 이 방법에 대해

create table bookkeepings (bk_name text primary key, bk_value integer not null); 

insert or replace into bookkeepings values ('Max Results', 50); 
insert or replace into bookkeepings values ('Qty Results', 0); 

create table results 
    (r_timestamp text primary key default (datetime(current_timestamp)), 
    result text); 

create trigger results_limit_trigger before insert on results" 
    for each row" 
    when (select bk_value from bookkeepings where bk_name = 'Qty Results') 
    >= (select bk_value from bookkeepings where bk_name = 'Max Results') 
    begin 
    delete from results 
     where r_timestamp = (select r_timestamp from results order by r_timestamp limit 1); 
    end; 

create trigger results_count_insert_trigger after insert on results 
    for each row 
    begin 
    update bookkeepings set bk_value = bk_value + 1 where bk_name = 'Qty Results'; 
    end; 

create trigger results_count_delete_trigger after delete on results 
    for each row 
    begin 
    update bookkeepings set bk_value = bk_value - 1 where bk_name = 'Qty Results'; 
    end; 
2
DELETE FROM table WHERE date = (SELECT MAX(date) from table LIMIT 1); 
+0

아, MAX는 좋은 아이디어 예 - 의도가 명확하고 가능성이 가장 빠릅니다. 그러나 전반적인 구조는 개선 될 수 없습니까? 이것에 대해 4 개의 쿼리를 수행하는 것은 꽤 우회적 인 것처럼 보입니다. – Voo

+1

왜 INSERT 및 DELETE입니까? 새로운 데이터와 현재 datetime으로 가장 오래된 항목을 덮어 쓰는 MIN (datetime)에 대한 UPDATE? – Sam

+0

@Sam 흥미로운 아이디어. 전체 레코드를 업데이트하는 것에 대해 생각조차하지 않았습니다. 아마 우리가 여전히 테이블을 재정렬해야하기 때문에 삽입/삭제보다 효율적이지는 않을지 모르지만, 나는 그것을 시도 할 것입니다. – Voo

1

:

여기에 완벽한 예입니다?

-- keep the last N records by expiration date 
declare @expDate datetime 

set @expDate = (select top 100 max(dt) from table order by dt asc); 
delete from table where dt > @expDate 
관련 문제