数据库字段命名导致的SQL报错

博客围绕数据库表设计展开,在执行插入操作时出现SQL语法错误。经排查,发现是字段名'key'与MySQL关键字冲突,将其改为'data_key'后问题解决,为数据库开发中避免类似错误提供了参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.表设计 

create table variables
(
    id                     bigint       not null comment '主键',
    business_key           varchar(128) null comment '业务key',
    `key`                  varchar(128) null comment 'Map中的key',
    value                  varchar(255) null comment 'Map中的value',
    data_type              varchar(32)  null comment '数据类型',
    created                datetime     null comment '创建时间',
    modified               datetime     null comment '修改时间',
    yn                     int          null comment '数据是否有效,1:有效,0:无效'
)
    comment '自定义变量表';
 

2.报错

org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: vtgate: http://xxxte-xx3b-xrxdxxe-4p2cf:12301/: target: test_db.0.master, used tablet: xx3b-11225725 (xx.10x.xx.1x): vttablet: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key,value,data_type,created,modified,yn) values  (  100021,null,'xx' at line 1 (errno 1064) (sqlstate 42000) (CallerID: ): Sql: "/* uag::test_db;1x.1x.1xx.1xx:16xx9;1x.2x.3x1.2x4:1xxx24;1x.x5.1xx.60:31x28;enable */  insert into variables (id,business_key,key,value,data_type,created,modified,yn) values  (  100021,null,'orderTime','1691579920000','Long','2023-08-09 19:21:50','2023-08-09 19:21:50',1 )

..........

..........

### The error may exist in xxx/core/dao/mapper/xxx/VariablesMapper.java (best guess)
### The error may involve com.xx.xxx.xx..dao.mapper.VariablesMapper.insertBatch-Inline
### The error occurred while setting parameters
### SQL: insert into variables (id,key,value,data_type,created,modified,yn) values  (  ?,?,?,?,?,?,? ),( ?,?,?,?,?,?,? )
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: vtgate: http://xxxte-xx3b-xrxdxxe-4p2cf:12301/: target: test_db.0.master, used tablet: xxx: vttablet: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key,value,data_type,created,modified,yn) values  (  100021,null,'orderTime' at line 1 (errno 1064) (sqlstate 42000) (CallerID: ): 

3.报错原因分析:

找了半天发现也没有啥错,最后通过浏览大量文档,决定本地调试下看看是不是字段名称与关键字冲突导致的,改了字段名称后立马好使了。

key这个字段与MySQL中的关键字有冲突,将key改为其它名称,比如data_key就可以了。

### 达梦数据库字段名转小写的方法 在达梦数据库中,如果希望将字段名称转换为小写并解决因大小写问题引发的 SQL 报错情况,可以通过以下几种方法实现: #### 方法一:通过 `TableField` 注解指定字段名称 可以在 MyBatis-Plus 的实体类中使用 `@TableField` 注解来显式定义字段名称,并将其包裹在双引号 (`"`) 中。这种方式能够有效避免框架自动生成的小写字段与达梦数据库不兼容的问题。 ```java @TableField("\"type\"") private int type; ``` 此方式适用于需要单独处理某些字段的情况[^1]。 --- #### 方法二:修改 JDBC 连接字符串参数 通过调整 JDBC 链接参数,可以影响返回字段的行为。例如,在连接 URL 后追加 `clobAsString=1` 参数,可能会改变字段返回的方式,从而间接影响字段名称的大小写行为。 JDBC 连接示例: ```plaintext jdbc:dm://127.0.0.1:5236/DEMO?clobAsString=1 ``` 需要注意的是,这种方法可能不会直接影响字段名称的大小写,而是针对特定数据类型的解析逻辑进行了优化[^2]。 --- #### 方法三:SQL 查询时强制指定字段名称 在编写 SQL 查询语句时,可以直接为字段名称添加双引号 (`"`),并将字段名称设置为所需的小写形式。这样可以确保查询结果中的字段名称保持小写状态。 示例 SQL 语句: ```sql SELECT id AS "id", name AS "name" FROM table_name; ``` 这种做法适合于手动编写的 SQL 脚本或者动态生成的 SQL 场景[^3]。 --- #### 方法四:全局配置字段映射策略 MyBatis-Plus 提供了字段命名策略的支持,允许开发者统一管理字段名称的映射规则。通过设置 `GlobalConfig.DbColumnUnderline(true)` 可以启用下划线风格的字段映射;而通过自定义 `MetaObjectHandler` 或者覆盖默认的字段处理器,则能进一步控制字段名称的大小写格式。 代码示例: ```java // 设置全局字段映射策略 globalConfiguration.setDbColumnUnderline(true); ``` 尽管这一方法主要用于标准化字段名称的命名约定,但它也可以作为辅助手段配合其他方案共同解决问题。 --- ### 总结 以上四种方法分别从不同角度解决了达梦数据库中小写字段名称的相关问题。具体选择哪种方法取决于实际应用场景以及项目的技术栈特点。推荐优先考虑 **方法一** 和 **方法三**,因为它们更加直观且易于维护。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值