如何插入到两个都与foreign_keys相关的表中?

How to insert into two tables that are both related together with foreign_keys?

提问人:dc-p8 提问时间:1/20/2017 最后编辑:marc_sdc-p8 更新时间:1/21/2017 访问量:875

问:

这是我的表格:

CREATE TABLE thread
(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT,
    post_id INTEGER,
    FOREIGN KEY(post_id) REFERENCES post(id)
);

CREATE TABLE post
(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    message TEXT,
    thread_id INTEGER,
    user_id INTEGER,
    FOREIGN KEY(thread_id) REFERENCES thread(id),
    FOREIGN KEY(user_id) REFERENCES user(id)
);

我有一个线程表,其中包含第一篇文章(作者的帖子)的 ID。

如果我想在现有线程中插入一个新帖子,这很容易,因为我知道 .thread_id

但是,如果我想创建一个新线程,我需要知道尚不存在的帖子。post_id

目前,我使用多个 SQL 查询和多个提交来做到这一点:

cur = db.execute("""
      INSERT INTO post (content, user_id)
      VALUES(?, ?, ?)""", [content, user_id])
db.commit()
post_id = cur.lastrowid
cur = db.execute("""
      INSERT INTO thread (title, post_id)
      VALUES(?, ?, ?)""", [title, post_id])
db.commit()
thread_id = cur.lastrowid
db.execute("""
      UPDATE post
      SET thread_id = ?
      WHERE id=?""", [thread_id, post_id])
db.commit()

但它非常丑陋,我认为有更好的解决方案。 如果我能做这样的事情,那就完美了,但这是不允许的:

INSERT INTO thread(title)
    VALUES("thread 1");
INSERT INTO post(post, thread_id)
    VALUES("first post of thread 1", LAST_INSERT_ROWID() AS tmp);
UPDATE thread
    SET post_id = LAST_INSERT_ROWID()
    WHERE id = tmp;

有什么想法吗?

谢谢!

python 数据库 sqlite 服务器端

评论


答:

0赞 CL. 1/20/2017 #1

您不需要(也不应该)在语句之间调用。commit()

读取是获取插入行的自动增量 ID 的正确方法。lastrowid


存储第一个帖子的 ID 不是必需的,因为它可以从其他信息派生:

SELECT id FROM post WHERE thread_id = ? ORDER BY /* timestamp */ id LIMIT 1;

存储它仅作为优化才有意义,但您的问题中没有任何内容表明这是必要的。