执行insert语句报错

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:5.7.25-TiDB-v4.0.2
  • 【问题描述】:

测试数据准备
创建测试表
CREATE TABLE tb_test (
c_int int(10) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin >ROW_FORMAT = Compact;

插入测试数据
INSERT INTO tb_test(c_int)
VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);

tb_test是个测试表,字段c_int为int型,tb_test现有10条数据,记录为0、1、2、3、4、5、6、7、8、9,执行下列语句会报错

insert into tb_test(c_int)
select
case when c_int != 0 then 10/c_int else 0 end
from tb_test

明明已经用case when排除了分母为0的情况,还是报下面的错误

1365 - Division by 0

已经尝试过清空sql_mode,全局和会话都清空了,无效。

1 个赞

没明白的问题是什么?报错的原因就是分母为 0 而已,这个动作和 SQL mode 的 设置有关系,具体可以百度一下,另外是否选择报错,看自己的业务,自行判断

问题是,我用了case when语句,排除了为0的情况,但是还是提示我存在分母为0

where中添加条件就不报错了,但是感觉case when的效果应该是一样的

insert into tb_test(c_int)
select
case when c_int != 0 then 10/c_int else 0 end
from tb_test
where c_int != 0

下面这种写法也不报错

insert into tb_test(c_int)
select
10/if(c_int=0,null,c_int)
from tb_test

我修改了描述,这样是否清晰。客户服务器上的sql_mode目前已经是空了。

已经按照网上描述的清空sql mode,全局和会话都清空了,还是提示这个。客户是生产环境,不能重启数据库。

mysql中也验证了,也有这个问题

我在 v4.0.8 版本中似乎没有复现这个问题

mysql> CREATE TABLE tb_test (
    -> c_int int(10) NULL DEFAULT NULL
    -> ) ;
Query OK, 0 rows affected (0.17 sec)

mysql> INSERT INTO tb_test(c_int)
    -> VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
Query OK, 10 rows affected (0.11 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> insert into tb_test(c_int)
    -> select
    -> case when c_int != 0 then 10/c_int else 0 end
    -> from tb_test;
Query OK, 10 rows affected (0.07 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> show variables like '%sql_mode%';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.09 sec)

mysql> select tidb_version();
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tidb_version()                                                                                                                                                                                                                                                                                                     |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Release Version: v4.0.8
Edition: Community
Git Commit Hash: 66ac9fc31f1733e5eb8d11891ec1b38f9c422817
Git Branch: heads/refs/tags/v4.0.8
UTC Build Time: 2020-10-30 08:21:16
GoVersion: go1.13
Race Enabled: false
TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
Check Table Before Drop: false |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)

感谢,刚在本机测试了,确实v4.0.8版本不报错。。。在v4.0.0和v4.0.2版本是有这个问题。。。

那应该是一个已修复的 BUG ,可以考虑升级一下集群。
另外在 MySQL 中验证也有这个问题是在 MySQL 什么版本验证的?我在 MySQL 8.0.19 版本也没有复现这个问题。

短期是不能升级了,目前客户是v4.0.2版本。

mysql是5.7版本,因为第三方组件问题,我们这边给客户配套的mysql版本要求是5.7

:ok_hand::ok_hand::ok_hand:

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。