如何批量向user_settings表插入users表的first_name、last_name对应记录?
批量插入用户设置记录的SQL解决方案
我来给你提供一个直接满足需求的SQL语句,完美适配你描述的场景:
INSERT INTO user_settings (user_id, locale, value_name, value) SELECT user_id, 'en_us' AS locale, 'first_name' AS value_name, first_name AS value FROM users UNION ALL SELECT user_id, 'en_us' AS locale, 'last_name' AS value_name, last_name AS value FROM users;
语句说明
这个SQL的核心思路是通过UNION ALL把两个查询结果合并,一次性生成所有需要插入的记录:
- 第一个
SELECT语句从users表中取出每个用户的user_id、固定的locale值en_us、标识字段first_name,以及对应用户的first_name值; - 第二个
SELECT语句同理,生成对应last_name的记录; UNION ALL会把这两个结果集合并成一个包含两倍于users表行数的数据集,最后通过INSERT INTO批量插入到user_settings表中。
可选优化:处理重复记录
如果user_settings表中可能已经存在相同的user_id + locale + value_name组合的记录(比如之前插入过),直接执行上面的语句会触发唯一性约束报错。这种情况下,你可以给user_settings添加(user_id, locale, value_name)的复合唯一索引,然后使用ON DUPLICATE KEY UPDATE来覆盖已有记录的value值:
INSERT INTO user_settings (user_id, locale, value_name, value) SELECT user_id, 'en_us' AS locale, 'first_name' AS value_name, first_name AS value FROM users UNION ALL SELECT user_id, 'en_us' AS locale, 'last_name' AS value_name, last_name AS value FROM users ON DUPLICATE KEY UPDATE value = VALUES(value);
这样如果遇到重复的组合,就会用users表中的最新值更新user_settings里的对应记录,而不是报错。
内容的提问来源于stack exchange,提问作者MJB
相关产品推荐
相关产品推荐

