2017-01-20 5 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) 
); 

У меня есть таблица потоков, которые содержат идентификатор первого поста (автор поста).

Если я хочу вставить новое сообщение в существующую тему, это легко, потому что я знаю 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 первого поста не является необходимым, поскольку она может быть получена из другой информации:

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

Хранение это будет иметь смысл только в качестве оптимизации, но ничего в вопросе не указывает на то, что это будет необходимо.