obsidian/笔记文件/2.笔记/删除表数据.md
2025-03-26 00:02:56 +08:00

2.5 KiB
Raw Permalink Blame History

#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 可能会影响性能,因此建议根据实际情况适当调用。