Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql字段名和关键字冲突

mysql字段名和关键字冲突的问题

作者:抱起我的猫去旅行

这篇文章主要介绍了mysql字段名和关键字冲突的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mysql字段名和关键字冲突

1.用"(`)"将有冲突的字段框起来,键盘上1边上那个键。

例:

SELECT * FROM yun_roleright WHERE right LIKE '%{13}%';

上面sql语句中right字段名与关键字冲突,会报错,,,应改成下面:

SELECT * FROM yun_roleright WHERE `right` LIKE '%{13}%';

mysql关键字冲突导致的sql执行错误

最近出现了一个很有意思的情况

我一共有三个数据库,开发,测试,正式,

分别放置在不同的服务器上

都是mysql数据库

这个时候出现了一个有意思的问题

我的sql如下

SELECT count(0) FROM sys_log  WHERE system = 'system'

在开发和测试数据库上执行此sql,没有问题

但是在正式环境的数据库上执行此sql,就会报如下错误

在这里插入图片描述

纳闷了半天,确定就是关键字的问题

但是比对了三个数据库,确实又没找到不同点,问大佬,大佬太忙,也没细究

解决办法

方案1:修改字段名(推荐)

注意:但是千万不要用sql语句去改,因为语句中含有关键字,所以sql是不会执行成功的,所以只能去数据库管理工具中修改

ALTER table sys_log change system system1 varchar(255) CHARSET utf8 COLLATE utf8_general_ci NULL COMMENT '系统'

【修改字段的名称】

语法:
alter table <表名> change <字段名> <字段新名称> <字段的类型>。

方案2:修改执行sql

SELECT count(0) FROM sys_log s  WHERE s.system = 'system'

或者

SELECT count(0) FROM sys_log  WHERE `system` = 'system'

其他相关

注意:当出现关键字的时候,然后业务层使用的sql借助了mybatis-plus框架写的,如

  public PageInfo<SysAuditLogDTO> selectAuditLog(ConditionDTO conditionDTO, Integer pageNum, Integer pageSize) {
        LambdaQueryWrapper<SysLogEntity> wrapper = Wrappers.<SysLogEntity>lambdaQuery()
                .orderByDesc(SysLogEntity::getCreateTime);
        if (StrUtil.isNotEmpty(conditionDTO.getSystem())) {
            wrapper.eq(SysLogEntity::getSystem, conditionDTO.getSystem());
        }
        if (conditionDTO.getStart() != null) {
            wrapper.ge(SysLogEntity::getCreateTime, conditionDTO.getStart());
        }
        if (conditionDTO.getFinish() != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(conditionDTO.getFinish());
            calendar.add(Calendar.DATE, 1);
            wrapper.le(SysLogEntity::getCreateTime, calendar.getTime());
        }
        Page<SysLogEntity> page = PageHelper.startPage(pageNum, pageSize).doSelectPage(() -> list(wrapper));
        return auditLogMapper.toDto(page.toPageInfo());
    }
//注:PageHelper是内部的一个工具类,对数据进行分页处理

有两种办法:

方案一:在xml文件中写sql

业务层调用:(中间省略了dao)

    public PageInfo<SysLogEntity > selectLog(ConditionDTO conditionDTO, Integer pageNum, Integer pageSize) {
        Page<SysLogEntity> page = PageHelper.startPage(pageNum, pageSize).doSelectPage(() -> sysLogDao.sysAuditLogListByQueryConditions(conditionDTO));
        return auditLogMapper.toDto(page.toPageInfo());
    }

mapper.xml文件

    <insert id="addOne">
        insert into sys_log (id, `system`)
        values (#{SysLogEntity.id},#{SysLogEntity.system});
    </insert>

方案二:实体类@TableField中添加 ``(推荐)

这样就支持mybatis-plus框架写法

@Data
@TableName("sys_log")
public class SysLogEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * id
     */
    @TableId
    private Long id;
    /**
     * 系统
     */
    @TableField("`SYSTEM`")
    private String system;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文