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));
1年前 评论
renxiaotu (作者) 1年前
小手冰凉 (楼主) 1年前
renxiaotu (作者) 1年前
小手冰凉 (楼主) 1年前
讨论数量: 10

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

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

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

1年前 评论

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

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));
1年前 评论
renxiaotu (作者) 1年前
小手冰凉 (楼主) 1年前
renxiaotu (作者) 1年前
小手冰凉 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!