MySQL 从 CSV 数据加载 NULL 值

2024-03-24

我有一个文件,其中可以包含 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    |       | 
+-------+--------+------+-----+---------+-------+
  

我正在尝试使用 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,因此我们将不胜感激。

谢谢 S。

edit

显示警告的输出:



+---------+------+--------------------------------------------------------+
| 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,'')
;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 从 CSV 数据加载 NULL 值 的相关文章

  • Dapper MySQL 返回值

    我在 ASP net Identity 项目中使用 dapper 和 MySql 时遇到问题 我想将用户插入到表 users 中 并希望从这次插入中返回自动生成的 id 但我收到语法错误 我不知道为什么 这是我的方法插入代码 public
  • 使用 \COPY 将带有 JSON 字段的 CSV 加载到 Postgres 中

    我正在尝试使用 COPY 命令将 TSV 数据从文件加载到 Postgres 表中 这是一个示例数据行 2017 11 22 23 00 00 id 123 class 101 level 3 这是我正在使用的 psql 命令 COPY b
  • 将附加数据获取到 django 表单下拉选择中

    我有一个具有外键的操作模型 它指定操作重复发生的频率 class Reoccurance models Model label models CharField Label max length 50 unique True days mo
  • 从 MySql 返回最后插入的 id

    我在执行以下查询时遇到了一些问题 START TRANSACTION SET LASTID 0 INSERT INTO Accounts Col1 col2 col3 col4 VALUES param1 param2 param3 par
  • Mysql Workbench 无法选择外键

    首先 我检查了很多问题并用谷歌搜索了很多 但没有一个解决我的问题 我正在使用 Mysql Workbench 6 3 创建表 我仅使用 gui 而不是单个查询来创建它们 之后我尝试创建一些外键int 11 列 但 GUI 不允许我这样做 这
  • 如何使用php在mysql中显示字幕中的多条新闻

    我在从 mysql 检索数据以在字幕中显示时遇到问题 当我访问网页时 它仅在字幕中显示数据库中的一项数据 我的问题是如何检索所有存储的数据 谢谢 下面是代码部分 select SELECT newsid headlines from new
  • Django migrate:不创建表

    经过一些错误后 我删除了数据库 删除了所有迁移文件 我留下了init py 现在 当我跑步时 python migrate py makemigrations It creates migrations correctly python m
  • 当存在多个字段分隔符时使用 AWK 忽略字段内的逗号

    我想像下面这样解析 CSV 记录awk or gawk 这些字段以逗号分隔 但最后一个字段 6 很特殊 因为它确实由子字段组成 这些子字段由 作为字段分隔符 或者 准确地说 分隔 这本身不是问题 我可以使用awk F 设置替代字段分隔符 但
  • 如何确定 CSV 文件字段是制表符分隔还是逗号分隔?

    我试图确定 CSV 文件字段是制表符分隔还是逗号分隔 我需要 PHP 验证 我怎样才能确定这一点 现在回答这个问题已经太晚了 但希望它能对某人有所帮助 这是一个简单的函数 它将返回文件的分隔符 function getFileDelimit
  • Bash:查找并连接文件

    我有以下结构 home DIR1 file ab csv DIR2 file cd csv DIR3 file3 ef csv Where file csv包含多行浮点数 每个 DIR 都有不同的浮点数 我想抓取所有的内容file csv文
  • 导入 csv 文件数据以填充 Prolog 知识库

    我有一个 csv 文件example csv其中包含两列 标题为 var1 和 var2 我想填充一个最初为空的 Prolog 知识库文件import pl具有重复的事实 而每一行example csv处理方式相同 fact A1 A2 f
  • mysql 密码 使用 PHP 连接到 MySQL

    在使用 PHP 连接到 MySQL 的教程中 您会看到类似于以下内容的内容 pdo new PDO mysql host localhost dbname mydb myuser mypassword 我在本地主机上有一个以这种方式工作的连
  • MySql:将多项选择数据存储在数据库中

    我的表单中有一个复选框列表 用户可以选择其中任何一个 也可以选择全部 认为用户选择他感兴趣的运动类型 我需要最好的数据库结构来存储这个用户选择 这样 将来我就可以获得所有这些数据 我想 我无法将每个 用户 ID 运动 选择作为新行存储在数据
  • 连接错误 - SQLSTATE[HY000] [2002] 操作超时

    我在从 Windows 2008 R2 应用程序服务器连接到也在 Windows 2008 R2 上运行的 MySQL 服务器时遇到问题 Laravel 应用程序报告错误 exception PDOException with messag
  • 如何正确转义 mysql“搜索/喜欢”查询?

    Summary 我目前正在使用 search field LIKE this gt db gt escape like str search string 逃避动态创建的搜索查询 创建的 SQL 语句结果不会产生任何错误 也不会产生任何结果
  • 如何将 PHP 会话数据保存到数据库而不是文件系统中?

    我有两个网站 一个是 TLS 一个不是 两个都适用于同一个客户端 但我需要这些网站彼此 并且仅彼此 共享通用数据users orders accounts etc 这通常可以通过以下方式完成 SESSION数据 但我显然这些不能跨其他站点工
  • 从 django 返回带有 BOM 的 UTF-8 编码的 csv

    我正在尝试输出一个用户可以用 Excel 打开的 CSV 文件 我已经用 UTF 8 编码了所有字符串 但是当我用 Excel 打开文件时 我看到了乱码 只有在将文件转换为带 BOM 的 UTF 8 在 Windows 上使用 notepa
  • PHP 从表行中检索数据并将其存储到变量

    我想这些问题已经说明了一切 我的查询结果会生成与条件匹配的行 我想从每个表列中获取每个数据并将其放入一个变量中 getinfo select user firstname user middlename user lastname from
  • 'SQLSTATE[HY093]:参数数量无效:绑定变量的数量与令牌数量不匹配'[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我收到 SQLSTATE HY093 的错误 参数编号无效 绑定变量的数量与标记的数量不匹配 if isset POST cada
  • 如何在 MySQL 查询编辑器中对列重新排序?

    我想移动专栏OtherSupport below Amount2 是否有捷径可寻 ALTER TABLE myTable MODIFY OtherSupport VARCHAR 50 AFTER Amount2

随机推荐