sql - 如何将行插入到具有自动递增的外键的表中,而无需对父表进行多次查询
问题描述
我有一个“指标”父表和一个“键值”子表。
中的每一行都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,然后再将适当的条目插入键值表?
解决方案
您可以使用last_insert_rowid()
:
insert into metrics(name) values(?);
insert into keyvalues(key, value, metric_id) values(?, ?, last_insert_rowid());
推荐阅读
- python - 将范围索引转换为日期时间索引时出错
- linux - bigbluebutton 在 Docker 中是否支持 html5?
- node.js - app.sendFile() 不起作用,而且 __dirname 也不起作用
- java - 我可以在 Java 的类方法中使用类变量吗?
- javascript - 无法在本地环境中从 RollBar 上的缩小形式转换 Angular v9 的 JavaScript 错误堆栈跟踪
- javascript - 如何在角度 8 中激活第一个 li
- javascript - 从函数调用函数的意外行为
- node.js - 如何在不查询父文档的情况下更新 MongoDB 中的子文档?
- kubernetes - 我可以在 Kubernetes Ingress 中使用 ip 地址而不是域名吗?
- javascript - 这是否可以使用 PHP 保持登录凭据有效?