SQLite如何批量插入多行数据 部分字段值来源于其他关联表
SQLite批量插入用户偏好数据解决方案
你之前的写法存在两个核心问题:
- 标量子查询套在
VALUES中仅会返回第一条匹配结果,因此不会为所有用户生成对应记录 - 第三个插入语句中引用了还未完成插入的
tiki_user_preferences表字段,因此触发字段不存在报错
正确实现方案
使用INSERT ... SELECT配合UNION ALL批量生成所有需要插入的行,无需拼接VALUES,写法如下:
INSERT INTO tiki_user_preferences ("user", prefName, value) -- 插入所有用户的user_information配置 SELECT login, 'user_information', 'private' FROM users_users UNION ALL -- 插入所有用户的mailCharset配置 SELECT login, 'mailCharset', 'utf8' FROM users_users UNION ALL -- 插入所有用户的realName配置,关联session_attribute取对应姓名 SELECT u.login, 'realName', s.value FROM users_users u INNER JOIN session_attribute s ON u.login = s.sid AND s.name = 'name';
兼容优化(可选)
如果需要兼容未在session_attribute表中存储姓名的用户,避免这类用户漏插入realName记录,可以将第三段查询修改为左连接加默认值:
SELECT u.login, 'realName', COALESCE(s.value, u.login) FROM users_users u LEFT JOIN session_attribute s ON u.login = s.sid AND s.name = 'name'
防重复插入优化(可选)
如果需要避免重复插入相同的偏好配置,可以把开头的INSERT修改为INSERT OR IGNORE:
INSERT OR IGNORE INTO tiki_user_preferences ("user", prefName, value) -- 后续UNION ALL部分和上述写法完全一致
内容的提问来源于stack exchange,提问作者King Julien
相关产品推荐
相关产品推荐

