MySQL 加载数据失败

Load data failure in MySQL

我正在尝试将数据从 csv 文件加载到 MySQL 中的 table。虽然一切看起来都很好,但出于某种原因它对我不起作用,而我的团队成员能够成功加载它。我们都有相同的 table 定义和数据。

我的 table 定义如下所示

   CREATE TABLE SIGNS ( 
   ROW_ID MEDIUMINT UNSIGNED NOT NULL,
   SUBJECT_ID MEDIUMINT UNSIGNED NOT NULL,
   Test_ID MEDIUMINT UNSIGNED NOT NULL,
   Name_ID TINYINT UNSIGNED NOT NULL,
   date_ID TINYINT UNSIGNED NOT NULL,
   race_NO MEDIUMINT UNSIGNED NOT NULL,
   MO_TIME DATETIME NOT NULL,
   ITEMID VARCHAR(255) NOT NULL,
   VALUE SMALLINT UNSIGNED NOT NULL,
  UNIQUE KEY SIGNS_ROW_ID (ROW_ID)
  )
  CHARACTER SET = UTF8;

我在 csv 文件中有一个数据,当我上传它时,可以正常处理 80 条记录。但是大约 20 条记录会抛出以下错误。

有时,我会收到错误消息 Out of range value for column 'VALUE' at row 438575

有时我得到 Data Truncated for column 'MO_TIME' at row 1,1265

如您所见,它非常不一致。但是数据没有问题,因为它对我的团队成员来说效果很好。跟constraints/index有关系吗?

我也遇到了其他 table 的类似奇怪问题。但是我截断了 table 并再次加载它并且它工作正常。

我在这里也试过了,但没用

您的 VALUE 列是 SMALLINT UNSIGNED。在聊天中,您说它在警告超出范围值的行中插入为 0。

看看我做的这个测试:

mysql> create table t ( i smallint unsigned);
Query OK, 0 rows affected (0.04 sec)

mysql> insert into t set i = -150;
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1264 | Out of range value for column 'i' at row 1 |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from t;
+------+
| i    |
+------+
|    0 |
+------+

如果您尝试将负值插入 smallint unsigned 列,则它超出了 unsigned 支持的范围。它被截断为 0,因为无符号数字类型仅支持非负值。

如果您尝试插入无效值,日期时间会发生类似情况。例如,一个常见的错误是使用 MM/DD/YYYY 格式的日期,MySQL 不支持:

mysql> create table t2 (mo_time datetime);
Query OK, 0 rows affected (0.04 sec)

mysql> insert into t2 set mo_time = '10/31/2019';
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+----------------------------------------------+
| Level   | Code | Message                                      |
+---------+------+----------------------------------------------+
| Warning | 1265 | Data truncated for column 'mo_time' at row 1 |
+---------+------+----------------------------------------------+

这显示了与您收到的相同的错误消息。

mysql> select * from t2;
+---------------------+
| mo_time             |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+

啊哈,过去被视为默认值的无意义日期值。值得庆幸的是,在 MySQL 的最新版本中,它被禁止了。

MySQL 仅支持 YYYY-MM-DD 格式。实际上,各部分之间的标点符号是可选的。有关详细信息,请参阅 https://dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html