以下是我的表格:
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;
有什么想法吗?
谢谢!
答案 0 :(得分:0)
您不需要(也不应该)在您的陈述之间致电commit()
。
阅读lastrowid
是获取插入行的自动增量ID的正确方法。
存储第一个帖子的ID不是必需的,因为它可以从其他信息中获得:
SELECT id FROM post WHERE thread_id = ? ORDER BY /* timestamp */ id LIMIT 1;
存储它只会作为优化而有意义,但您的问题中没有任何内容表明这是必要的。