2017-01-20 40 views
0

這裏是我的表:如何插入兩個與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

你不需要(也不應該)在你的陳述之間打電話commit()

正在讀取lastrowid是獲取插入行的自動增量ID的正確方法。


存儲第一篇文章的ID是沒有必要的,因爲它可以從其他的信息得到:

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

保存它將使意義只是作爲一個優化,但沒有在你的問題表明,這將是必要的。

相關問題