要在SQLite中截断表,我需要使用以下语法:
DELETE FROM someTable
但是,如果表存在,我该如何截断表?
不幸的是,这会引发错误:
DELETE FROM someTable IF EXISTS
这也不起作用:
DELETE IF EXISTS FROM someTable
感谢。
答案 0 :(得分:56)
这是两个步骤:
使用以下方法删除该表中的所有数据:
Delete from TableName
然后:
DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
答案 1 :(得分:43)
恕我直言,删除表并重新创建它会更有效。是的,在这种情况下你可以使用“IF EXISTS”。
答案 2 :(得分:43)
做delete
。这来自SQLite文档:
“当从DELETE语句中省略WHERE并且要删除的表没有触发器时,SQLite使用优化来擦除整个表内容,而不必单独访问表的每一行。这种”截断“优化使得删除运行速度更快。在SQLite版本3.6.5之前,truncate优化还意味着sqlite3_changes()和sqlite3_total_changes()接口以及count_changes pragma实际上不会返回已删除行的数量。该问题已在版本中修复3.6.5“。
答案 3 :(得分:8)
我得到了它:
SQLiteDatabase db= this.getWritableDatabase();
db.delete(TABLE_NAME, null, null);
答案 4 :(得分:7)
SELECT name FROM sqlite_master where name = '<TABLE_NAME_HERE>'
如果表名不存在,则不会返回任何记录!
您也可以使用
SELECT count(name) FROM sqlite_master where name = '<TABLE_NAME_HERE>'
如果计数为1,则表示表存在,否则返回0
答案 5 :(得分:4)
删除后我也使用VACUUM
命令。因此,对于完全TRUNCATE
等效,我使用此代码:
DELETE FROM <table>;
UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = '<table>';
VACUUM;
重置自动增量
,删除功能不起作用DELETE FROM "sqlite_sequence" WHERE "name"='<table>';
要了解有关VACUUM的更多信息,请访问:https://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/
答案 6 :(得分:0)
不幸的是,我们在SQLite中没有“TRUNCATE TABLE”命令,但您可以使用SQLite的DELETE
命令从现有表中删除完整数据,但建议使用{{1} }命令删除整个表并再次重新创建它。
答案 7 :(得分:0)
&#34; sqllite&#34;没有&#34; TRUNCATE&#34;订单比mysql,然后我们必须得到其他方式... 这个函数(reset_table)frist删除表中的所有数据然后重置表中的AUTOINCREMENT键.... 现在你可以在任何你想要的地方使用这个功能......
示例:
private SQLiteDatabase mydb;
private final String dbPath = "data/data/your_project_name/databases/";
private final String dbName = "your_db_name";
public void reset_table(String table_name){
open_db();
mydb.execSQL("Delete from "+table_name);
mydb.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE name='"+table_name+"';");
close_db();
}
public void open_db(){
mydb = SQLiteDatabase.openDatabase(dbPath + dbName + ".db", null, SQLiteDatabase.OPEN_READWRITE);
}
public void close_db(){
mydb.close();
}
答案 8 :(得分:0)