假设您有三个基本表,可以实现任务和类别之间的多对多关系:
CREATE TABLE task(
id INTEGER AUTOINCREMENT PRIMARY KEY NOT NULL,
name INTEGER NOT NULL,
description INTEGER NOT NULL
);
CREATE TABLE category(
id INTEGER AUTOINCREMENT PRIMARY KEY NOT NULL,
name TEXT NOT NULL
);
CREATE TABLE task_category(
task_id INTEGER,
category_id INTEGER,
);
如果我想在我的数据库中插入名为"写脚本"有一些描述"我写了一个python脚本。"与类别相关的" python"和#34;脚本",我该怎么办?假设python和脚本类别已经存在于数据库中。
我看了一下这个问题:SQLite many-to-many relationship?
似乎外键的某些实现可能有用但我仍然不知道INSERT语句会是什么样子。
我最好的尝试是将任务插入任务表,然后执行select以获取我刚刚插入的任务及其id,然后手动将该id链接到task_category表中的类别。这似乎不是一种非常有效的方法。
将记录插入sqlite数据库并将其链接到多对多关系的标准方法是什么?
答案 0 :(得分:1)
外键约束只是约束,即它们阻止您将无效数据插入数据库。它们不会为您节省实际插入数据的工作,因此它们与此问题无关。 (它们仍然有用。)
在Python中,lastrowid属性返回刚刚插入的ID:
cursor.execute("INSERT INTO task(name, description) VALUES(?, ?)",
["wrote script", "I wrote a python script."])
task_id = cursor.lastrowid
cursor.execute("""INSERT INTO task_category(task_id, category_id)
SELECT ?, id
FROM category
WHERE name IN (?, ?)""",
[task_id, "python", "scripting"])