将行从一个表复制到另一个表时如何解决数据截断错误,两个表具有相同的模式?

Posted

技术标签:

【中文标题】将行从一个表复制到另一个表时如何解决数据截断错误,两个表具有相同的模式?【英文标题】:How to tackle data truncation error when copying rows from one table to another, both tables having same schema? 【发布时间】:2021-07-27 21:18:27 【问题描述】:

数据库有两个具有相同架构的表。

        date VARCHAR(20),
        track VARCHAR(150),
        race_number INT,
        horse_number INT,

        early_last5 FLOAT(10,1),

        PRIMARY KEY (track, race_number, horse_number, date)

一个名为 section_table,另一个名为 window_section_table。 我想将 section table 的所有内容复制到 window_section_table。 我会做最合乎逻辑的事情。

INSERT INTO window_sectional_table SELECT * FROM sectional_table;

不幸的是,我被这个错误吓坏了。

Data truncated for column 'early_last5' at row 1

我调查第 1 行。第 1 行看起来像这样。

+------------+----------+-------------+--------------+-------------+
| date       | track    | race_number | horse_number | early_last5 |
+------------+----------+-------------+--------------+-------------+
| 2021-05-03 | GUNNEDAH |           1 |            1 |         0.0 |
+------------+----------+-------------+--------------+-------------+

我该如何进行?我相信值 0.0 应该自动填充为空值。

【问题讨论】:

early_last5 列是否声明为 NOT NULL?您显示具有数据类型的列的摘要,但请尝试SHOW CREATE TABLE window_sectional_table\G 查看所有列选项。 【参考方案1】:

Data truncated for column 'early_last5' at row 1 错误指的是您的 INSERT 语句,而不是数据库中的哪个特定值被截断。

我认为值 0.0 应该自动填充为空值。

不。这没有在您的INSERT 中定义,也没有在表创建语句中定义。

我该如何进行?

最简单的方法是将FLOAT 的值转换为INSERTDECIMAL,如果您希望将NULL 转换为0.0,请加上IFNULLFLOAT 数据类型长期以来一直是许多人的眼中钉,他们希望它能像典型的小数一样工作。

这里有一个快速的 SQL 语句,应该会让你再次行动起来:

INSERT INTO `window_sectional_table` (`date`, `track`, `race_number`, `horse_number`, `early_last5`)
SELECT `date`, `track`, `race_number`, `horse_number`,
       CAST(IFNULL(`early_last5`, 0) AS DECIMAL(10,1))
  FROM `sectional_table`
 ORDER BY `track`, `race_number`, `horse_number`, `date`;

【讨论】:

当初为什么会出现这个错误?在 float(10,1) 列上插入 (0.0) 有什么问题? FLOAT 中的 0.0 没有任何问题。正如我在答案中提到的,row 1 参考不是在谈论数据,而是INSERT 语句本身? 我不想将NULL 转换为0.0。我想将所有行从一个表复制到另一个具有相同架构的表。我想知道这种差异发生在哪个值上。有没有办法调试这个?这怎么可能?如果任何值不兼容,它将如何插入到第一个表中。我很困惑。 如果您希望保持 NULL 不变,请随时放弃 IFNULL。至于“差异”,归结为人们使用FLOAT,而他们真正应该使用DECIMAL。 TL;DR:FLOAT 不会按照大多数人的预期做事,所以期待意外……或者使用 DECIMAL ?

以上是关于将行从一个表复制到另一个表时如何解决数据截断错误,两个表具有相同的模式?的主要内容,如果未能解决你的问题,请参考以下文章

sql 将行从一个表复制到另一个表

调用触发器时将行从一个表复制到另一个表

将行从一个表复制到另一个表

如何将行从一个 MySQL 数据库复制到另一个

使用 INSERT 查询将行从一个表复制到另一个表 [关闭]

将行从一个选项卡复制并删除到另一个选项卡