2013-04-11 1 views
3

저는 squeryl을 사용하여 테이블에서 모든 레코드를 삭제하는 방법을 살펴 보았습니다. 내가 가지고 올 수있는 유일한 방법은squeryl이있는 테이블에서 모든 레코드를 삭제하려면 어떻게해야합니까?

myTable.deleteWhere(r => r.id.isNotNull) //id is the primary key 

입니다이 이상하고 아마도 비효율적 인 것 같다.

squeryl을 사용할 때 테이블에서 모든 레코드를 삭제하는 가장 깨끗한 방법은 무엇입니까?

+1

효율성에 대해서 - 사실 일 수 있지만, 왜 우리는 전체 데이터베이스를 빨리 삭제해야합니까? 이것은 병목 현상이 될 것 같지 않습니다. – VasyaNovikov

+0

@ VasyaNovikov 네 말이 맞아. 테스트를 위해이 도구를 사용하고 있으므로 신속하게 수행하고 싶지만 다시 테스트를 위해 많은 양의 데이터가 필요하지 않습니다. – iwein

답변

4

deleteWhere 절은 논리 부울을한다, 그래서 당신은 간단하게 말할 수 :

myTable.deleteWhere(r => 1 === 1) 

어느 출력 문을 수행해야합니다

DELETE FROM mytable WHERE 1 = 1 

자동 where 절을 제거하려는 경우, 당신은 수를 시도 :

myTable.deleteWhere(r => 1 === 1.inhibitWhen(true)) 

Where 절을 모두 억제해야합니다.

당신은 훨씬 더 효율적인 방법을 찾고 있다면 당신의 데이터베이스가 TRUNCATE 지원 또는 다른 동등한 기능, 당신은 JDBC를 통해 직접 쿼리를 org.squeryl.Session에서 java.sql.Connection를 얻을 수 및 발행 할 수 있습니다. 불행히도, 이것은 Squeryl이 제공하는 안전성을 잃을 것입니다.

+0

옵션을 제공해 주셔서 감사합니다. 매우 유용합니다. 이상한 거기에 deleteAll, 또는 삭제 (everyWhere), 또는 뭔가 생각하지 않아? – iwein

+0

그래, 내가 때때로 놀란 몇 가지 기능이 존재하지 않는다. 그러나 데이터베이스 시스템 전체에서 기능을 수행하므로 가끔 원인이있을 수 있습니다. 일반적으로 네이티브 SQL을 실행하거나 실행하는 무언가를 찾을 수 있기 때문에 대개 누락 된 부분을 해결할 수 있습니다. – jcern

+0

그건 그렇고, inhibitWhen는 MySQL에서 작동하지 않습니다 : [오류] RuntimeException : 예외를 실행하는 동안 예외 : 당신은 SQL 구문에 오류가 있습니다; 근처의 '2 행에서'올바른 구문을 찾으려면 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. [오류] errorCode : 1064, sqlState : 42000 [오류] 파서에서 삭제 [오류] 여기서 – iwein

관련 문제