on duplicate key update问题请教

MySQL8.0,表结构如下:
CREATE TABLE sys_user (
id bigint NOT NULL AUTO_INCREMENT,
username varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ‘’ COMMENT ‘用户名’,
password varchar (1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT ‘’ COMMENT ‘密码’,
name varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ‘’ COMMENT ‘姓名’,
mobile varchar (256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ‘’ COMMENT ‘手机号’,
PRIMARY KEY (id) USING BTREE,
UNIQUE KEY idx_username (username) USING BTREE,
KEY idx_mobile (mobile) USING BTREE,
KEY idx_name (name) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT=’用户信息表’;

插入一条数据:
INSERT INTO test.sys_user (id, username, password, name, mobile) VALUES (191, ‘1709211986061925621’, ‘’, ‘梵蒂冈地方’, ‘10000000000’);

现在有个需求,批量导入用户的时候,如果新导入的数据,字段值不为空则更新数据库中已有的数据字段,更新字段 name 的 sql 如下:

on duplicate key update问题请教

但是更新字段 mobile 又是可以的:

on duplicate key update问题请教
我本来怀疑是字段 name 和关键字有关系,把字段 name 修改为 name1 执行还是报错:

on duplicate key update问题请教
单独执行 update 语句又是可以的。

但是我把字段 name1 的值修改为数字的字符串就可以,汉字、字母等字符串就执行报错
on duplicate key update问题请教

最佳答案

@小手冰凉 下面这个我测试是可以执行

INSERT INTO test.sys_user ( username, name, mobile) VALUES ( '1709211986061925621', '梵蒂冈地方', '10000000000') on duplicate key update name=if(VALUES(name) is null,test.sys_user.name,VALUES(name));
3年前 评论
renxiaotu (作者) 3年前
小手冰凉 (楼主) 3年前
renxiaotu (作者) 3年前
小手冰凉 (楼主) 3年前
讨论数量: 10

if(values(name) 导致的,字符串不应该用于 bool,且隐式转换失败
直接这样不符合你的需求吗?

INSERT INTO test.sys_user ( username, name, mobile) VALUES ( '1709211986061925621', '梵蒂冈地方', '10000000000') on duplicate key update name=values(name);
3年前 评论
小手冰凉 (楼主) 3年前
renxiaotu (作者) 3年前
小手冰凉 (楼主) 3年前

在 sql 里面写逻辑,就是耍流氓

3年前 评论

@小手冰凉 下面这个我测试是可以执行

INSERT INTO test.sys_user ( username, name, mobile) VALUES ( '1709211986061925621', '梵蒂冈地方', '10000000000') on duplicate key update name=if(VALUES(name) is null,test.sys_user.name,VALUES(name));
3年前 评论
renxiaotu (作者) 3年前
小手冰凉 (楼主) 3年前
renxiaotu (作者) 3年前
小手冰凉 (楼主) 3年前