【问题标题】:SQLite relational INSERT with unknown foreign key具有未知外键的 SQLite 关系插入
【发布时间】:2017-11-19 04:55:44
【问题描述】:

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

  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
    ...        |  ....      | ...
    

第一个表包含varNameID。第二个包含每个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 记录的varNameID。这就是我使用的原因:

(SELECT id FROM varNames WHERE varName = @name)

与直接通过ID 寻址相比似乎很慢。如何将INSERT 的性能提高到第二个表中?

【问题讨论】:

  • 取决于你如何做事......如果你的数据量很少,它应该不会很慢。如果可能的话,您可以将 id 的值存储在您的 .net 代码中,或者获取 last inserted row id

标签: database vb.net sqlite query-performance


【解决方案1】:

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

使用a transaction(最好结合多个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;

Related.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2016-12-28
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多