Как вставлять строки в таблицу с внешним ключом, который автоматически увеличивается без нескольких запросов к родительской таблице

У меня есть родительская таблица "метрики" и дочерняя таблица "ключ-значение".

каждая строка в metrics может иметь связанные пары "ключ-значение", которые будут храниться в таблице "ключ-значение" (количество пар "ключ-значение" не ограничено, может быть 0 или более)

идентификаторы строк метрик автоматически увеличиваются, а временные метки генерируются 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?
   }

}

Должен ли я сначала вставить в таблицу метрик, запросить у нее идентификатор последней строки, а затем перейти к вставке в таблицу ключевых значений соответствующих записей?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
219
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать last_insert_rowid():

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

при выполнении пакета возникает проблема с этим подходом, поскольку last_insert_row_id() возвращает идентификатор таблицы внешнего ключа. ``` НАЧАТЬ ТРАНЗАКЦИЮ; ВСТАВЬТЕ В метрику (имя) ЗНАЧЕНИЯ («имя1»); INSERT INTO свойства VALUES('f2', 'v2', last_insert_rowid()); INSERT INTO свойства VALUES('f3', 'v3', last_insert_rowid()); СОВЕРШИТЬ; ```

Avba 10.12.2020 17:08

Другие вопросы по теме