如何为多对多关系创建INSERT语句? [英] SQLite3 how to create an insert statement for many-to-many relationship?

查看:0
本文介绍了如何为多对多关系创建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"])

这篇关于如何为多对多关系创建INSERT语句?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆