SQLite中的多个插入从其他表中获取数据

时间:2015-06-02 19:47:41

标签: sql sqlite sql-insert

在SQLite中,我有一个简单的留言板,我希望在每个用户第一次看到任何帖子时加上时间戳。

CREATE TABLE messages (
    message_id INTEGER PRIMARY KEY,
    mb_topic_id INTEGER NOT NULL REFERENCES mb_topics(mb_topic_id),
    message_poster INTEGER NOT NULL REFERENCES users(user_id),
    message_content TEXT,
    message_post_time TIMESTAMP DEFAULT (strftime('%s', 'now'))
)

CREATE TABLE messages_seen (
    message_id INTEGER NOT NULL REFERENCES messages(message_id),
    user_id INTEGER NOT NULL REFERENCES users(user_id),
    seen_time TIMESTAMP DEFAULT (strftime('%s', 'now')),
    UNIQUE (message_id, user_id)
)

我想做什么,在一个SQL语句中,如果可能的话,当用户加载消息线程时,INSERT OR IGNORE messages_seen userID {我有} {每个{ {1}}匹配message_id(我有)。

因此,如果user_id为4且mb_topic_id为7,我可以执行以下操作:

mb_topic_id

这可能会返回类似(9,11,14,26)的内容。我会这样做:

SELECT message_id FROM messages WHERE mb_topic_id = 7

有没有办法将其压缩成一个陈述?顺便说一下,我运行它的服务器运行的是SQLite 3.6.20。

2 个答案:

答案 0 :(得分:1)

SQLite支持使用SELECT statements in INSERT statements

例如:

INSERT OR IGNORE INTO messages_seen (message_id, user_id)
SELECT message_id, user_id
FROM ...

答案 1 :(得分:1)

[编辑:关于删除SQLite 3.7.11的无关建议]

您可以将insert-select与用户ID一起用作文字:

INSERT OR IGNORE INTO messages_seen (message_id, user_id) 
SELECT message_id, 4
FROM   messages 
WHERE  mb_topic_id = 7