【问题标题】:Multiple inserts into SQLite getting data from other tables多次插入 SQLite 从其他表中获取数据
【发布时间】:2015-06-02 19:47:41
【问题描述】:

在 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 IGNOREmessages_seen 他们的 userID (我有)每个 message_id 匹配 @987654326 @(我有)。

所以如果 user_id 是 4 而 mb_topic_id 是 7,我可以这样做:

SELECT message_id FROM messages WHERE mb_topic_id = 7

这可能会返回类似 (9,11,14,26) 的结果。然后我会这样做:

INSERT OR IGNORE INTO messages_seen (message_id, user_id) VALUES (9,4);
INSERT OR IGNORE INTO messages_seen (message_id, user_id) VALUES (11,4);
INSERT OR IGNORE INTO messages_seen (message_id, user_id) VALUES (14,4);
INSERT OR IGNORE INTO messages_seen (message_id, user_id) VALUES (26,4);

有没有办法将它压缩到一个语句中?顺便说一句,我运行它的服务器正在运行 SQLite 3.6.20。

【问题讨论】:

    标签: sql sqlite sql-insert


    【解决方案1】:

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

    您可以将用户 ID 用作插入选择:

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

    【讨论】:

    • 我确实看到了关于 3.7 的东西...这就是为什么我指定我正在使用的服务器正在运行 3.6。
    • @DanGoodspeed 由于某些不明原因,我在 OP 中错过了这一点。我会从我的答案中删除它。
    【解决方案2】:

    SQLite 支持使用SELECT statements in INSERT statements

    例如:

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

    【讨论】:

    • 我不确定我是否遵循那里的声明...从消息中选择 user_id?消息中没有 user_id。
    • @DanGoodspeed - 我很抱歉。我的意思只是作为一个例子。您只需使用返回您打算插入的记录的任何查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多