2015-01-30 2 views
0

행을 추가하고 테이블에서 한 행을 삭제하려고 할 때 문제가 있습니다. 10 개 이상스칼라 SQLite DELETE에 대한 잘못된 쿼리

가있는 경우 가장 오래된을 제거하여이 데이터베이스에 10 개 최신 항목을 저장하도록되어

def addItem(item:Item)={ 
     val query = items.filter(_.name === name) 
     items += (item.name,item.timestamp) 
     if(query.list.length > 10) 
     { 
     query.sortBy(timestamp).take(1).delete 
     } 
    } 

하지만

SlickException : Invalid query for DELETE statement: A single source table is required, found List((s2,Comprehension)) 
를 말하는 오류가 발생합니다 : 내가 지금 가지고있는 것은

데이터베이스에 다른 테이블이 있지만이 테이블과 관련이 없어야하며 두 테이블 간의 관계조차 없습니다.

잘못된 정보가 있습니까? 또는 DB에 마지막 10 개의 값만 저장하는 다른 방법이 있습니다. 타임 스탬프는 java.sql.timestamp이고 나는 스칼라 라이브러리를 사용하여 SQLite를 scala 용으로 사용하고 있습니다. 또한 Item 클래스는 문자열과 타임 스탬프 만 보유하고 있습니다.

감사합니다. 어떤 도움을 주셔서 감사합니다!

+0

정확하게 기억하면 삭제하고 잘 섞어서 사용하지 마십시오 – cvogt

+0

아이디어를 취하지 않고 첫 번째 요소를 선택하는 방법은? –

+0

SQL이이를 지원합니까? DELETE ... LIMIT ...? 슬릭은 SQL이 할 수없는 것을 할 수 없다. : /. – cvogt

답변

0

좋아, 의견에 언급 된 바와 같이 taketake과 작동하지 않는 것 같습니다. take 이외의 쿼리로 쿼리의 첫 번째 요소를 선택하는 다른 방법은없는 것 같습니다. 예를 들어 .first은 첫 번째 요소의 쿼리가 아닌 행의 실제 데이터를 반환하므로 delete을 해당 요소에 적용 할 수 없습니다.

val oldestTime = query.sortBy(timestamp).first._2 //selects the timestamp of the oldest element 
query.filter(._timestamp === oldestTime).delete // deletes all rows with that timestamp 

난이 언젠가는 누군가가 도움이되기를 바랍니다 : 나는 그것이 작동 얻을 무슨 짓 해결 방법의 일종이었다.