我创建了一个列
`date_start` datetime NOT NULL DEFAULT '1970-01-01'
但是,当我使用 LOAD DATA 命令从 CSV 文件上传数据时,date_start
保存的值为 0000-00-00 00:00:00 的空白条目?
我创建了一个列
`date_start` datetime NOT NULL DEFAULT '1970-01-01'
但是,当我使用 LOAD DATA 命令从 CSV 文件上传数据时,date_start
保存的值为 0000-00-00 00:00:00 的空白条目?
NULL
和“空白条目”在 MySql 中并不总是被同等对待。在datetime
数据类型的情况下,空白条目会自动转换为 0000-00-00 00:00:00。您可以将其视为一种类型转换,其中空白被类型转换为零。
DEFAULT
在您的数据文件中,尝试用关键字替换所有空白日期。
datetime
表示您的列以Y-m-d H:i:s
( 0000-00-00 00:00:00
) 格式存储日期和时间。
date
表示您的列仅以Y-m-d
( 0000-00-00
) 格式存储日期。
如果您在插入数据时不指定值,则使用默认值,但当您从 CSV 文件插入数据时,它会为字段指定值,因此不使用默认值。
空白条目是日期时间字段的无效值,因此0000-00-00 00:00:00
使用该值代替,就像任何无法解析为有效日期(或部分日期)的值一样。
MySQL SQL 模式默认允许零日期。
我的信念是 LOAD DATA INFILE 命令正在读取旨在成为 DATETIME 的空白位置,并在插入之前自动使用零日期。这可以解释为什么没有应用您的默认约束 - 插入时该值不为空。
我认为你有两个选择:
SET SQL_MODE='NO_ZERO_DATE'
MySQL 有一个烦人的(在我看来)行为,在某些情况下,如果给定一个无效值来存储在列中,它将存储一个预定义的“错误值”。例如,在日期或日期时间上下文中,它将存储您注意到的“零日期”;对于 ENUM 列,它将存储 ''(对应于数字上下文中的 0)作为错误值。
虽然它不优雅,但您可以尝试进行导入并允许插入无效的零日期,然后发出
UPDATE
table_name
SET
date_start = '1970-01-01 00:00:00'
WHERE
date_start = '0000-00-00 00:00:00'