1 场景复现

  • MySQL: 5.7.24-27
  • 表结构

    (两张独立的表)
[表 RRR1]
CREATE TABLE `RRR1` (
`R1` float NOT NULL COMMENT 'R1',
`R2` float NOT NULL COMMENT 'R2'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='RRR1'; [表 Person11]
CREATE TABLE `Person11` (
`CSSJY111` varchar(3) DEFAULT NULL COMMENT '测试数据元011',
`CSSJY107` int(3) DEFAULT NULL COMMENT '测试数据元007',
`CSSJY106` int(3) DEFAULT NULL COMMENT '测试数据元006',
`CSSJY112` datetime DEFAULT NULL COMMENT '测试数据元012',
`CSSJY103` varchar(10) DEFAULT NULL COMMENT '测试数据元003',
`CSSJY113` blob COMMENT '测试数据元013',
`CSSJY104` varchar(10) DEFAULT NULL COMMENT '测试数据元004',
`CSSJY108` varchar(10) DEFAULT NULL COMMENT '测试数据元008',
`CSSJY102` varchar(10) DEFAULT NULL COMMENT '测试数据元002',
`CSSJY109` varchar(10) DEFAULT NULL COMMENT '测试数据元009',
`CSSJY101` varchar(10) DEFAULT NULL COMMENT '测试数据元101',
`CSSJY110` date DEFAULT NULL COMMENT '测试数据元010',
`CSSJY105` int(3) DEFAULT NULL COMMENT '测试数据元005'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='个人信息';
  • 异常SQL
DELETE FROM
CJ_TEST.`RRR1`
WHERE `R1` IN (
SELECT * FROM (
SELECT `R1` FROM CJ_TEST.`RRR1` WHERE `R1` IN (
SELECT `CSSJY111` FROM (
SELECT `CSSJY111` FROM `CJ_TEST`.`Person11` ORDER BY `CSSJY112` ASC, `CSSJY111` LIMIT 3
) ttt -- 中间表 ttt
)
) B WHERE B.R1 = 1 -- 中间表 B
)

报异常:

[Err] 1292 - Truncated incorrect DOUBLE value: 'dc5'

翻译: [错误] 1292 - 数据截断:截断不正确的双精度值:'dc5'

注: MySQL数据库 必须带中间表 ttt 和 B,否则 查询会失败

MySQL数据库中 带中间表 可避免异常:[Err] 1093 - You can't specify target table 'tableName' for update in FROM clause

FROM clause : FROM 子句

(翻译: 你不能在DELETE/UPDATE这类修改操作的FROM子句中指定目标表——tableName。)

"不能先select出同一表中的某些值,再update这个表(在同一语句中)"

"不能在同一表中查询的数据作为同一表的更新数据"

"注意,这个问题只出现于mysql,mssql和Oracle不会出现此问题。" (博主尚未验证此结论)

原因: DELETE/UPDATE (修改)操作 表tableName时,其FROM子句的实际操作表是 FROM子句内的虚表(结果集)

解决办法:
1. 在select外边套一层括号"( 原SQL )",让数据库认为你不是查同一表的数据作为同一表的更新数据
2. 将select的结果集临时设置为中间表——`select * from ( 原select的结果集 ) TMP`,让修改操作的FROM对象为中间表

详见:MySQL之You can't specify target table for update in FROM clause解决办法 - CSDN

2 原因分析

源字段与目标字段的类型不一致!!!

异常SQL中:
源字段为 Person11表的CSSJY111字段(varchar(3))
目标字段为 RRR1表的R1字段(float)

3 解决方案

情况1: 源字段值A与目标字段值B的类型不一致

  • 解决方案1

修改数据库表的字段类型。

ALTER TABLE RRR1 MODIFY COLUMN R1 VARCHAR(3);
  • 解决方案2

sql_mode

(此方案不太推荐,但迫不得已时亦可使用)

SET SESSION sql_mode = '';

补充/延申: sql_mode的其它操作

select @@GLOBAL.sql_mode;
select @@SESSION.sql_mode; -- STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

情况2: UPDATE的语法错误

网络博客中很多人更多遇到的是此类情况————语法错误

例如:update table set A = "a" and B = "b" where id = 1 (报错)

  • 解决方案

原SQL语句的 "and" 换成逗号 ","

update table set  A = "a" ,   B=  "b" where  id = 1 (正确)

Y 不足之处与反思

1 追根到底,本质上是什么原因导致的此异常? [√]

—— 此问题已解决 于 2020-10-14 21:14

2 sql_mode的配置起到了什么作用? [待解决]

3 为什么这么做可以成功解决? [√]

—— 此问题已基本解决 于 2020-10-14 21:14

X 参考与推荐文献

[数据库/MySQL]解决异常:Data truncation: Truncated incorrect DOUBLE value: 'dc5'的更多相关文章

  1. Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: 'L

    1.错误叙述性说明 [ERROR:]2015-06-08 09:49:42,523 [异常拦截] org.hibernate.exception.DataException: error execut ...

  2. Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: 'L

    1.错误描述 [ERROR:]2015-06-08 09:49:42,523 [异常拦截] org.hibernate.exception.DataException: error executing ...

  3. com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value:...

    在使用mybatis的@Update注解的时候,报了一个这样的错 ### Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncat ...

  4. 异常-Data truncation: Truncated incorrect DOUBLE value: '-9370.3530-'

    1详细异常日志 9/11/04 17:36:09 ERROR base.SQLHelper: Data truncation: Truncated incorrect DOUBLE value: '- ...

  5. Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: 'as3'

    执行更新时的出错信息 Whitelabel Error Page This application has no explicit mapping for /error, so you are see ...

  6. Data truncation: Truncated incorrect DOUBLE value 解决方案

    1.情况限制 此处的错误解决方案只讨论: 在使用Mybatis时,传入数组且使用<foreach>标签时出现此种报错: 2.报错案例 mapper.java /** * @Descript ...

  7. java.sql.SQLException: Data truncation: Truncated incorrect DOUBLE value

    mysql 报这个异常:java.sql.SQLException: Data truncation: Truncated incorrect DOUBLE value update 表名 set c ...

  8. Data truncation: Truncated incorrect DOUBLE value:

    在写sql查询语句queryRunner.update(connection,"update account set balance=? where name=?",account ...

  9. Data truncation: Truncated incorrect DOUBLE value错误的解决方案

    Data truncation: Truncated incorrect DOUBLE value错误的解决方案: 当在修改某条单位记录时,发生了Data truncation: Truncated ...

  10. mysql 插入中文报错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value...

    总结写在前面, 总结: 当Java通过jdbc链接mysql插入中文时,要保证程序可以正常执行,而且插入的中文不会乱码, mysql服务器端,对数据表(不是数据库)的编码设置,要保证是支持中文的,例如 ...

随机推荐

  1. centos7(虚拟机)下安装redis

    centos7(虚拟机)下安装redis 安装 下载redis安装包 wget https://download.redis.io/releases/redis-6.2.1.tar.gz 解压安装包 ...

  2. vs xamarin获取sha1申请百度sdk密钥

    请查看微软帮助文档 查找密钥存储的签名 - Xamarin | Microsoft Docs

  3. 小白开始成长了+洛谷1488与CF629A Far Relative’s Birthday Cake题解

    终于开始我的博客生活了,希望博客可以让我记住学了什么,错了什么,接下来会有什么将出现. 记录写ACM生涯中的一些经验和网工经验吧,如果有人看我博客的话,希望可以留言给我提提意见,指导指导我啦~~~ 正 ...

  4. TCP 异常断开连接的过程

    Tcp连接正常断开的情况,大家都了解,也就是一端发送Fin报文开启四次挥手,然后 sock 结构销毁,但是我之前很少去追踪 Tcp 在对端宕机,进程 Crash 之后的行为逻辑.前段时间正巧遇到了这样 ...

  5. js下载流文件

    npm install js-file-download --savenpm install axios --save import axios from "axios"; imp ...

  6. pintia 3-7-5 逆波兰表达式求值 (20 分)

    3-7-5 逆波兰表达式求值 (20 分) 逆波兰表示法是一种将运算符(operator)写在操作数(operand)后面 的描述程序(算式)的方法.举个例子,我们平常用中缀表示法描述的算式(1 + ...

  7. JS this指向相关

    function Foo() { getName = function() { console.log(1) } return this;}Foo.getName = function() { con ...

  8. K8S—dashboard ui部署

    一.Dashboard UI概述 仪表板是基于Web的Kubernetes用户界面.您可以使用仪表板将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随 ...

  9. OpenJudge2811:熄灯问题(枚举)

    熄灯问题 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行.每个按钮的位置上有一盏灯.当按下一个按钮后,该按钮以及周围位置(上边.下边.左边.右边)的灯都会改变一次.即,如果灯原来是点亮的,就会被熄 ...

  10. nginx配置https详细过程

    准备工作 需要先准备好你域名对应的证书和私钥,也就是cert证书和key.我部署是很常见的ng+tomcat双层配置,ng作为前端的代理,所以tomcat就不需要自己处理https,ng作为代理以ht ...