让SQLite删除表中的所有记录

6

我想要删除我位于 C:/ 磁盘中的数据库中 MAIN_TABLE 中的所有记录。我正在使用 SQLite,并且不在 Android 平台上。我只看到过在一些例子中使用 TURNCATE,所以我不确定是否正确。

代码:

package Exporter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class DeleteAllRecords { 
//public void   runDeleteAllRecords()throws Exception, SQLException {
  public static void main(String[] argv) throws Exception {

String driverName = "org.sqlite.JDBC";
Class.forName(driverName);

String url = ("jdbc:sqlite:" + "C:/Test/DATABASE.db");
Connection connection = DriverManager.getConnection(url);
Statement stmt = connection.createStatement();

String sql = "TRUNCATE MAIN_TABLE";
stmt.executeUpdate(sql);
sql = "DELETE FROM MAIN_TABLE";
stmt.executeUpdate(sql);
}
}

错误:

Exception in thread "main" java.sql.SQLException: near "TRUNCATE": syntax error
at org.sqlite.core.NativeDB.throwex(NativeDB.java:397)
at org.sqlite.core.NativeDB._exec(Native Method)
at org.sqlite.jdbc3.JDBC3Statement.executeUpdate(JDBC3Statement.java:116)
at Exporter.DeleteAllRecords.main(DeleteAllRecords.java:21)
3个回答

8

SQLite没有实际的TRUNCATE命令。相反,它具有一个截断优化器,当您运行没有WHERE子句的DELETE时将使用该优化器。因此,您应该只使用没有WHERE子句的DELETE FROM来截断您的表:

String sql = "DELETE FROM MAIN_TABLE";
stmt.executeUpdate(sql);

根据文档所述:

截断优化

当DELETE语句中省略WHERE条件,并且要删除的表没有触发器时,SQLite使用优化来擦除整个表内容,而不必逐行访问该表。这种“截断”优化使得删除操作运行速度更快。


3

仅仅使用 "DELETE FROM MAIN_TABLE" 可能不够。你的数据在数据库文件中仍然以删除标记存在。

如果你想要在原有数据的位置上存储 0,你需要使用第二个命令 "VACUUM"。

大致代码:

String sql = "DELETE FROM MAIN_TABLE";
stmt.executeUpdate(sql);
sql = "VACUUM";
stmt.executeUpdate(sql);

0
db.execSQL("delete from "+ TABLENAME);

不要放星号


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接