提问人:dc-p8 提问时间:1/20/2017 最后编辑:marc_sdc-p8 更新时间:1/21/2017 访问量:875
如何插入到两个都与foreign_keys相关的表中?
How to insert into two tables that are both related together with foreign_keys?
问:
这是我的表格:
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赞
CL.
1/20/2017
#1
您不需要(也不应该)在语句之间调用。commit()
读取是获取插入行的自动增量 ID 的正确方法。lastrowid
存储第一个帖子的 ID 不是必需的,因为它可以从其他信息派生:
SELECT id FROM post WHERE thread_id = ? ORDER BY /* timestamp */ id LIMIT 1;
存储它仅作为优化才有意义,但您的问题中没有任何内容表明这是必要的。
评论