我有一个文件,可以包含3到4列用逗号分隔的数值.空字段定义为,但位于行末尾时除外:

1,2,3,4,5
1,2,3,,5
1,2,3

下表是在MySQL中创建的:

+-------+--------+------+-----+---------+-------+
| Field | Type   | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| one   | int(1) | YES  |     | NULL    |       | 
| two   | int(1) | YES  |     | NULL    |       | 
| three | int(1) | YES  |     | NULL    |       | 
| four  | int(1) | YES  |     | NULL    |       | 
| five  | int(1) | YES  |     | NULL    |       | 
+-------+--------+------+-----+---------+-------+

我正在try 使用MySQL load命令加载数据:

LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS 
TERMINATED BY "," LINES TERMINATED BY "\n";

结果表:

+------+------+-------+------+------+
| one  | two  | three | four | five |
+------+------+-------+------+------+
|    1 |    2 |     3 |    4 |    5 | 
|    1 |    2 |     3 |    0 |    5 | 
|    1 |    2 |     3 | NULL | NULL | 
+------+------+-------+------+------+

问题在于,当原始数据中的字段为空且未定义时,MySQL出于某种原因不使用列默认值(为NULL),而是使用零.当字段一起丢失时,可以正确使用NULL.

不幸的是,在这个阶段,我必须能够区分NULL和0,所以任何帮助都将不胜感激.

谢谢

编辑

显示警告的输出:

+---------+------+--------------------------------------------------------+
| Level   | Code | Message                                                |
+---------+------+--------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: '' for column 'four' at row 2 | 
| Warning | 1261 | Row 3 doesn't contain data for all columns             | 
| Warning | 1261 | Row 3 doesn't contain data for all columns             | 
+---------+------+--------------------------------------------------------+

推荐答案

这会满足你的要求.它将第四个字段读入局部变量,然后如果局部变量最终包含空字符串,则将实际字段值设置为NULL:

LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(one, two, three, @vfour, five)
SET four = NULLIF(@vfour,'')
;

如果它们都可能是空的,那么您可以将它们全部读入变量,并有多个SET语句,如下所示:

LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = NULLIF(@vone,''),
two = NULLIF(@vtwo,''),
three = NULLIF(@vthree,''),
four = NULLIF(@vfour,'')
;

Mysql相关问答推荐

正在获取MySQL死锁,因为这个查询需要很长时间.

了解查询中ORDER BY的行为

了解MySQL_stmt_BIND_NAMED_Param()-MySQL C API

插入时发生日期时间字段溢出错误

在 mySQL 中计算每日数组的每周指标

基于多个 where 子句在规范化表中查找公共 ID(值)

for each 查询设置 MySQL @@session.time_zone 而不是 CONVERT_TZ 的缺点?

MySQL CHECK 约束以确保记录不使用自动增量 ID 引用自身?

任何值的 SQL WHERE 子句?

Mysql Pivot 查询/建议

如何创建将行转换为列的 MySQL 查询?

MySQL中的会话客户端是什么

Laravel 查询构建器 where() 用于何时产品必须有多个标签(使用 product_tags 数据透视表多对多)

是否可以在一个查询中将字符串附加到许多匹配的行

Mysql insert with loop out of select 语句

MySQL:将日期时间插入其他日期时间字段

如何删除没有临时表的 MySQL 表中的所有重复记录

PHP 判断 NULL

更改 Laravel 的 created_at 和 updated_at 的名称

为什么在 MySQL 中使用外键约束?