在程序中批量查找并更新数据如何设计比较好

问题,程序中批量查找并更新数据,除了循环还有什么更好的方式吗
批量提交数据结构如下
{
    "data": [
        {
            "gsm_address_id": 1,
            "province_name": "浙江省",
            "city_name": "杭州市",
            "exp_area_name": "余杭区",
            "detail_address": "某某大街",
            "post_code": "1232",
            "phone": "13212345123",
            "consignee": "联系人"
        },
        {
            "gsm_address_id": 1,
            "province_name": "浙江省",
            "city_name": "杭州市",
            "exp_area_name": "余杭区",
            "detail_address": "某某大街",
            "post_code": "1232",
            "phone": "13212345123",
            "consignee": "联系人"
        }
        ...
    ]
}
数据库结构如下
// 用户表
CREATE TABLE `users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '姓名',
  `phone` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '手机号'
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

// 地址表
CREATE TABLE `addresss` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL COMMENT '用户 id',
  `gsm_address_id` varchar(20) DEFAULT NULL COMMENT 'gsm 地址 id',
  `province_name` varchar(20) DEFAULT NULL COMMENT '省',
  `city_name` varchar(20) DEFAULT NULL COMMENT '市',
  `exp_area_name` varchar(30) DEFAULT NULL COMMENT '区',
  `detail_address` varchar(50) DEFAULT NULL COMMENT '详细地址',
  `post_code` varchar(10) DEFAULT NULL COMMENT '邮编',
  `tel` varchar(20) DEFAULT NULL COMMENT '联系方式',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `consignee` varchar(20) DEFAULT NULL COMMENT '联系人名称',
  `is_default` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否默认 1 是 0 不是',
  `status` tinyint(4) DEFAULT NULL COMMENT '状态 1 正常 2 禁用',
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`) USING BTREE,
  KEY `gsm_user_number` (`gsm_user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=501 DEFAULT CHARSET=utf8;

接受到传递的 json 数据。第一步:根据 gsm_address_id 查找地址表中是否存在该数据,存在则更新,不存在则新增。第二步:根据手机号查找用户表数据。存在这个用户则地址表中 user_id 该用户的 id,不存在则默认为 0 。除了循环处理以外,更好的做法该如何处理。谢谢大佬们~

阅读 2.1k
3 个回答

个人觉得还是需要循环,但是可以省略下,检测数据是否存在的步骤,期待其他大神们的回复

REPLACE INTO 
新手上路,请多包涵

我觉得mysql 当中的 case when 或许能帮你一点
UPDATE categories SET
display_order = CASE id

    WHEN 1 THEN 3 
    WHEN 2 THEN 4 
    WHEN 3 THEN 5 

END,
title = CASE id

    WHEN 1 THEN 'New Title 1'
    WHEN 2 THEN 'New Title 2'
    WHEN 3 THEN 'New Title 3'

END
WHERE id IN (1,2,3);

这是一个例子,希望对你有帮助

mysql有这个功能

ON DUPLICATE KEY UPDATE

百度有很详细的教程,就不贴了

不想循环的话,可以拼接一个长的sql吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题