SQLite:从字符串路径创建文件结构 Table。新查询或修改现有?

SQLite: Create File Structure Table from String Path. New query or modify existing?

我有一个 SQLite table:

FileDataID | Path
0            /FileAtRoot.txt
1            /video/gopro/father/mov001.mp4
2            /pictures/family/father/Oldman.jpg
3            /documents/legal/father/estate/will.doc

使用 designed by forpas,创建了一个仅包含目录结构的新 table:

Directory | Directory_Parent | Value
0           null               root
1           0                  documents
2           1                  legal
3           2                  father
...

参考:

既然存在table的目录结构,我需要使用外键link将原始文件Directory_Parent 在新的 table:

FileDataID | Directory_Parent | Value
0            0                  FileAtRoot.txt
1            19                 mov001.mp4
2            9                  Oldman.jpg
3            4                  will.doc

如何使用 SQLite 从原始数据创建此 table?

为此,您必须已经拥有 table dir_struct(来自您之前的问题),以便可以将文件名插入 ID 为 table 的文件中它们所属的目录。

首先我创建新的 table files:

CREATE TABLE files(
  FileDataID INTEGER REFERENCES listfile(FileDataID), 
  Directory_Parent INTEGER REFERENCES dir_struct(Directory), 
  Value
);

您还必须为 listfile 中的 FileDataID 创建唯一索引,因为它未定义为 PRIMARY KEYUNIQUE,因此其他 [= 中的列51=]s(如filesFileDataID列)可以引用。

CREATE UNIQUE INDEX idx_listfile_FileDataID ON listfile(FileDataID);

递归 CTE 用于查询 dir_struct 并构建所有可能的路径,并将其连接到 listfile 以匹配文件名及其路径:

WITH cte AS (
  SELECT Directory, Directory_Parent, Value, '' full_path 
  FROM dir_struct
  WHERE Directory = 0
  UNION ALL
  SELECT d.Directory, d.Directory_Parent, d.Value, full_path || d.Value || '/'
  FROM dir_struct d INNER JOIN cte c
  ON c.Directory = d.Directory_Parent
)
INSERT INTO files(FileDataID, Directory_Parent, Value)
SELECT f.FileDataID, c.Directory, SUBSTR(f.Path, LENGTH(c.full_path) + 1)
FROM listfile f INNER JOIN cte c
ON f.Path LIKE c.full_path || '%' AND INSTR(SUBSTR(f.Path, LENGTH(c.full_path) + 1), '/') = 0 

请参阅 demo,其中 dir_struct 中的插入代码也已修改,因为现在 table listfile 包含根目录中的文件,这确实不存在于您上一个问题的示例数据中。

所以demo中的代码必须整体执行.

我使用了你的 1MB 样本数据和查询 运行 非常快。
但是,对于 1M 行(来自您第一次发布的 link),我也进行了测试(并发现重复项,您必须在执行任何其他操作之前将其删除),创建 table files耗时约1.5小时。
正如我在回答您之前的问题时提到的那样,如果这是一次性的事情,那么就使用它。如果你经常需要它,那么你应该考虑别的东西。