具有未知外键的 SQLite 关系插入



我在 VB.NET 应用程序中创建了一个SQLite数据库。它存储多个varName记录的时间序列数据超过2个表:

  1. varNames

    CREATE TABLE IF NOT EXISTS varNames(
        id      INTEGER PRIMARY KEY,
        varName TEXT    UNIQUE
    );
    

    它看起来像这样:

    ID   |  varName
    ---------------
    1    |  var1
    2    |  var2
    ...  |  ...
    
  2. varValues

    CREATE TABLE IF NOT EXISTS varValues(
        timestamp INTEGER,
        varValue  FLOAT,
        id        INTEGER,
        FOREIGN KEY(id) REFERENCES varNames(id) ON DELETE CASCADE
    );
    

    它看起来像这样:

    timestamp  |  varValue  |  id
    ------------------------------
    1          |  1.0345    |  1
    4          |  3.5643    |  1
    1          |  7.7866    |  2
    3          |  4.5668    |  2
    ...        |  ....      | ...
    

第一个表包含带有 IDvarName。第二个包含每个varName的值作为时间序列(每timestamp(。外键链接表。插入到varNames如下所示:

INSERT OR REPLACE INTO varNames (
    varName
) VALUES (
    @name
);

我将特定varName的值插入到第二个表中,如下所示:

INSERT OR REPLACE INTO varValues (
    timestamp,
    varValue,
    id
) VALUES (
    @timestamp,
    @value,
    (SELECT id FROM varNames WHERE varName = @name)
);

我不知道插入时相应varValues记录的varName ID。这就是为什么我使用:

(SELECT id FROM varNames WHERE varName = @name)

与直接ID解决相比,似乎很慢。如何将INSERT性能提高到第二个表中?

...提高第二个表中的插入性能?

使用事务(最好合并多个INSERT(:

BEGIN TRANSACTION;
INSERT OR REPLACE INTO varValues (
    timestamp,
    varValue,
    id
) VALUES (
    @timestamp,
    @value,
    (SELECT id FROM varNames WHERE varName = @name)
);
INSERT OR REPLACE INTO varValues (
    timestamp,
    varValue,
    id
) VALUES (
    @timestamp,
    @value,
    (SELECT id FROM varNames WHERE varName = @name)
);
etc. ...
END TRANSACTION;

相关。

最新更新