首页 > 解决方案 > 如何将行插入到具有自动递增的外键的表中,而无需对父表进行多次查询

问题描述

我有一个“指标”父表和一个“键值”子表。

中的每一行都metrics可以有关联的键值存储在“键值”表中(键值的数量不受限制,可以是 0 或更多)

指标行 ID 是自动递增的,并且时间戳由 sqlite 生成(因为允许在同一实例中使用多个指标)

例如,我想到了这样的模式:

CREATE TABLE metrics (
        id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        created_at TIMESTAMP NOT NULL DEFAULT (datetime('now','localtime')),
        name TEXT NOT NULL,
    );

CREATE TABLE keyvalues(
    key TEXT,
    value TEXT,
    metric_id INTEGER,
    CONSTRAINT fk_keyval
      FOREIGN KEY(metric_id) 
      REFERENCES metrics(id)
      ON DELETE CASCADE
);

metric id键是auto-incremented并且timestamp是由sqlite生成的,我不确定如何同时将行插入到指标表和关联keyvalues表中。

我的内部 API 看起来像(伪代码):

Metric {
  name: String,
  keyvals: Map<String,String>
}


func count_metric(metric: Metric) {
  sqlite.execute("insert into metrics(name) value(metric.name)");
// now how to go about inserting to the `keyvalues` table?
   foreach (key,value) in metric.keyvals {
       sqlite.execute("insert into keyvalues(key,value,metric_id) values(?,?,?)" , key , value , "rowid") // how do I get the row id efficiantly and ensure correctness if multiple inserts occur conccurently?
   }

}

我是否必须先插入指标表,查询最后一行ID,然后再将适当的条目插入键值表?

标签: sqlsqliteforeign-keyssql-insert

解决方案


您可以使用last_insert_rowid()

insert into metrics(name) values(?);
insert into keyvalues(key, value, metric_id) values(?, ?, last_insert_rowid());

推荐阅读