【发布时间】:2020-10-26 18:47:52
【问题描述】:
当我尝试将 INSERT 放入包含从视图中提取的数据的表中时遇到此错误。
我注意到许多关于此错误的现有问题与查询中的ON 或AND 条件有关,但我没有这些问题。这是一个简单的SELECT x FROM ... 视图,我正在调用它,就像这样......
@query_statement = CONCAT('insert into target_table SELECT
mv.col1
mv.col2
mv.col3
FROM (',database_name,'.myView mv) );
您会注意到我使用了一个变量 database_name,因为该语句位于存储过程中并循环通过一堆数据库,调用附加到每个数据库的视图,然后将此数据插入到单独的表中。 (我知道这不是一个很好的方法,但这是我们继承的遗留问题)
现在我面临的主要错误是,这使调试成为一场噩梦,即该查询适用于某些数据库,但不适用于其他数据库。我检查了调用视图的源表,并且没有将 DOUBLE 作为数据类型的列。
【问题讨论】:
-
正在进行数据类型转换;必须是某些
target_table列被定义为数字(DECIMAL 或整数类型),并且必须是myView表/视图之一正在返回需要转换的值,因为其中一列是返回的(col1、col2 或 col3)是与目标列不同的类型。 MySQL 转换为 DOUBLE 作为中间步骤。'xxx'的报告值表示返回的表达式之一是字符类型。 (这里有问题吗?) -
@spencer7593 我已经两次和三次检查了源表和目标表之间的所有列类型。只有一列返回错误,并且两者的列类型都是 VARCHAR(255)。您能否进一步解释一下将 MYSQL 转换为 DOUBLE 作为中间步骤?可以肯定的是,这两个表中都没有具有 DOUBLE 数据类型的列,因此这可能发生在 INSERT 期间的某个时刻。我也尝试过显式 CAST 和 CONVERT 有问题的列,但仍然存在相同的错误。
-
数据类型转换记录在 MySQL 参考手册dev.mysql.com/doc/refman/8.0/en/type-conversion.html ... 主要是在这里猜测,但似乎是将字符串转换为数字,即 MySQL 执行计划将字符串转换为浮点数点值 (DOUBLE),并且浮点值被提供给数字列的插入。 (即,如果目标列是字符类型,我们不会期望出现此错误)
-
如果没有 1) 目标列的数据类型和 2) SELECT 返回的列的数据类型,我们无法给出任何具体的建议如何覆盖隐式转换并避免错误,以及 3) 错误的值(真的是
'xxx'?)另外,由于我没有看到问题,我将假设问题是“观察到的行为的原因是什么?”原因是对某些“不正确”值的隐式数据转换。 -
@spencer7593 1) 目标列的数据类型是 VARCHAR(255),2) 与 #1 相同,3) 发送的值也是一个 VARCHAR,并且只包含字符串,有不是数值。令人讨厌的是,这个错误只发生在某些数据库上,而不是其他数据类型也完全相同且值也都只是 VARCHAR 的数据库。
标签: mysql stored-procedures view insert