删除表数据.md 2.5 KB

#sql

如果需要保留,sql表结构,而只是删掉,其他的表数据,可以参考这个逻辑

	    public async Task DeleteAllDataAsync<T>() where T : new()
	    {
		    await Task.Run(() =>
		    {
			    lock (_db)
			    {
				    try
				    {
					    string tableName = typeof(T).Name;
					    _db.Execute($"DELETE FROM {tableName}");
				    }
				    catch (Exception ex)
				    {
					    Debug.LogError($"Error deleting all records from {typeof(T).Name}: {ex.Message}");
					    throw;
				    }
			    }
		    });
	    }

如果要删除整个表结构,可以参考[[drop table删除表结构]]

需要注意的是,如果只是执行,上述操作,是不会释放空间,和重置id索引的;

1. 重置自增序列计数器:

如果你的表使用了 AUTOINCREMENT 关键字,你可以通过删除并重新创建表来重置序列。这可以通过 DROP TABLE 和 CREATE TABLE 实现。或者,如果不想删除表,可以使用 DELETE 后更新序列计数器:

   DELETE FROM sqlite_sequence WHERE name='your_table_name';

这将删除 sqlite_sequence 表中对应表的序列记录,从而重置自增值。

2. 减小数据库文件大小:

删除数据后,可以通过 VACUUM 命令来重建数据库文件,释放未使用的空间:

   VACUUM;

VACUUM 命令会清理数据库文件,移除未使用的空间,这可能会帮助减少文件大小,但可能需要一些时间来完成,特别是在大型数据库上。

应用到你的代码中

你可以修改 DeleteAllDataAsync 方法,加入重置序列和压缩数据库的功能:

public async UniTask DeleteAllDataAsync<T>() where T : new()
{
    await UniTask.Run(() =>
    {
        lock (_db)
        {
            try
            {
                string tableName = typeof(T).Name;
                _db.Execute($"DELETE FROM {tableName}");
                // 重置自增序列
                _db.Execute($"DELETE FROM sqlite_sequence WHERE name='{tableName}'");
                // 压缩数据库
                _db.Execute("VACUUM");
            }
            catch (Exception ex)
            {
                Debug.LogError($"Error deleting all records from {typeof(T).Name}: {ex.Message}");
                throw;
            }
        }
    });
}

这段代码在删除表数据后,会清除自增序列,并尝试压缩数据库文件。注意,频繁执行 VACUUM 可能会影响性能,因此建议根据实际情况适当调用。