如何为多对多关系创建INSERT语句?
假设您有三个基本表,它们实现任务和类别之间的多对多关系:
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,
);
如果我想要在数据库中插入一个名为"WRITED SCRIPT"的任务,并且描述为"I WRITE A PYTHON SCRIPT"。这是与类别"python"和"脚本"相关联的,我该怎么做呢?假设数据库中已经存在python和脚本类别。
我看了这个问题:SQLite many-to-many relationship?
似乎外键的某些实现可能很有用,但我仍然不知道INSERT语句会是什么样子。
我最好的尝试是将任务插入到TASK表中,然后执行SELECT以获取我刚刚插入的带有其ID的任务,然后手动将该ID链接到TASK_CATEGORY表中的类别。这似乎不是一种非常有效的方法。将记录插入到SQLite数据库并将其链接到多对多关系的标准方法是什么?
解决方案
外键约束就是约束,即它们阻止您将无效数据插入数据库。它们不会为您节省实际插入数据的工作,因此它们与这个问题无关。(它们仍然有用。)
在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"])
相关文章