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

时间:2017-01-20 05:00:47

标签: python database sqlite server-side

以下是我的表格:

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;

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您不需要(也不应该)在您的陈述之间致电commit()

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

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

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

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