You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite3 Vacuum操作:保留/重置主键的语法咨询

SQLite Vacuum操作与主键重置解决方案

现有三个SQLite3表(Location、Music、History)需执行Vacuum空间整理操作,要求:

  • Location、Music表保留原有主键值及自增序列
  • History表重置主键(让自增Id从1重新开始)
    同时对SQLite Vacuum文档中的“unaliased”概念存在疑问,以下是具体操作语法与概念解释。

一、Location与Music表(保留主键的Vacuum操作)

这两个表需要保留主键的原有值及自增序列,可通过「重建表+导入原数据+VACUUM」的方式实现,既完成空间整理,又不改变主键逻辑。

操作步骤(以Location表为例,Music表执行相同流程)

  1. 创建临时表备份原数据:
CREATE TABLE temp.Location_temp AS SELECT * FROM Location;
  1. 删除原表:
DROP TABLE Location;
  1. 重建原表结构:
CREATE TABLE IF NOT EXISTS Location(
    Id INTEGER PRIMARY KEY,
    Code TEXT, Name TEXT, ModifyTime FLOAT, ImagePath TEXT,
    MountPoint TEXT, TopDir TEXT, HostName TEXT,
    HostWakeupCmd TEXT, HostTestCmd TEXT, HostTestRepeat INT,
    HostMountCmd TEXT, HostTouchCmd TEXT, HostTouchMinutes INT,
    Comments TEXT
);
  1. 导入备份数据(主键值会完整保留):
INSERT INTO Location SELECT * FROM temp.Location_temp;
  1. 重建索引:
CREATE UNIQUE INDEX IF NOT EXISTS LocationCodeIndex ON Location(Code);
  1. 删除临时表:
DROP TABLE temp.Location_temp;
  1. 执行VACUUM整理整个数据库空间:
VACUUM;

注:SQLite 3.25.0及以上版本支持VACUUM TABLE Location;直接针对单表整理,可替代步骤7,但需确保表无依赖约束。


二、History表(重置主键的Vacuum操作)

要重置History表的自增主键,需排除原Id字段,重新生成自增序列,同时完成空间整理。

操作步骤

  1. 创建临时表备份除Id外的所有数据:
CREATE TABLE temp.History_temp AS SELECT
    Time, MusicId, User, Type, Action, SourceMaster, SourceDetail,
    Target, Size, Count, Seconds, Comments, Timestamp
FROM History;
  1. 删除原表:
DROP TABLE History;
  1. 重建原表结构:
CREATE TABLE IF NOT EXISTS History(
    Id INTEGER PRIMARY KEY,
    Time FLOAT, MusicId INTEGER, User TEXT, Type TEXT,
    Action TEXT, SourceMaster TEXT, SourceDetail TEXT,
    Target TEXT, Size INT, Count INT, Seconds FLOAT,
    Comments TEXT, Timestamp FLOAT
);
  1. 导入备份数据,不指定Id字段,让自增主键自动从1开始生成:
INSERT INTO History (
    Time, MusicId, User, Type, Action, SourceMaster, SourceDetail,
    Target, Size, Count, Seconds, Comments, Timestamp
) SELECT * FROM temp.History_temp;
  1. 重建所有索引:
CREATE INDEX IF NOT EXISTS MusicIdIndex ON History(MusicId);
CREATE UNIQUE INDEX IF NOT EXISTS TimeIndex ON History(Timestamp);
CREATE INDEX IF NOT EXISTS TypeActionIndex ON History(Type, Action);
  1. 删除临时表:
DROP TABLE temp.History_temp;
  1. 执行VACUUM整理空间:
VACUUM;

三、关于“unaliased”概念的解释

在SQLite的Vacuum文档中,unaliased指直接作用于真实存在的表名,而非通过子查询、别名或视图。例如:

  • 合法操作:VACUUM TABLE History;(直接指定真实表名)
  • 非法操作:VACUUM TABLE (SELECT * FROM History) AS t;(使用了子查询别名,属于aliased形式)

Vacuum命令仅能操作数据库中实际存在的物理表,不能对临时生成的结果集或别名对象执行整理。


内容的提问来源于stack exchange,提问作者WinEunuuchs2Unix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:15:35