多次插入 SQLite 从其他表中获取数据
Multiple inserts into SQLite getting data from other tables
在 SQLite 中,我有一个简单的留言板,我想在每个用户第一次看到任何 post.
时添加时间戳
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
(我有)每个 message_id
匹配 mb_topic_id
(我有)。
所以如果 user_id 是 4 而 mb_topic_id 是 7,我可以这样做:
SELECT message_id FROM messages WHERE mb_topic_id = 7
这可能 return 类似于 (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.
SQLite 支持使用 SELECT
statements in INSERT
statements.
例如:
INSERT OR IGNORE INTO messages_seen (message_id, user_id)
SELECT message_id, user_id
FROM ...
[编辑:删除了关于 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
在 SQLite 中,我有一个简单的留言板,我想在每个用户第一次看到任何 post.
时添加时间戳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
(我有)每个 message_id
匹配 mb_topic_id
(我有)。
所以如果 user_id 是 4 而 mb_topic_id 是 7,我可以这样做:
SELECT message_id FROM messages WHERE mb_topic_id = 7
这可能 return 类似于 (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.
SQLite 支持使用 SELECT
statements in INSERT
statements.
例如:
INSERT OR IGNORE INTO messages_seen (message_id, user_id)
SELECT message_id, user_id
FROM ...
[编辑:删除了关于 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