MySQL - 插入ZERO日期而不是默认日期

时间:2012-03-09 16:33:57

标签: mysql

我有一个带有一些NULL日期字段的管道分隔文件。我将此数据加载到临时表中,其中包含NULL日期的默认值。就我而言,我希望默认为1950-01-01。但是,这些默认值似乎被覆盖并且正在插入0000-00-00。这是我写的一个快速bash脚本测试:

#!/bin/bash

CMD="CREATE TEMPORARY TABLE IF NOT EXISTS ar_tmp LIKE ar; LOAD DATA INFILE '/some/path/ar.txt' INTO TABLE ar_tmp FIELDS TERMINATED BY '|'; SELECT * FROM ar_tmp;"

mysql -uuser -ppassword db -e "$CMD" > /opt/rxdb/tmp.log

我已经浏览了我的源文件,并确认预期的NULL日期为\ N,并且文件中的文件没有.-

这是ar_tmp的结构:

Field                   Type            Null    Key     Default Extra
customer_code           int(11)         NO      PRI     0
activity_date           date            NO      PRI     1950-01-01
delivery_date           date            NO      PRI     1950-01-01
sequence                int(11)         NO      PRI     0
type                    varchar(10)     YES             NULL
due_date                date            YES             1950-01-01
original_charge         float           YES             NULL
prior_alloc             float           YES             NULL
current_alloc           float           YES             NULL
future_alloc            float           YES             NULL
open_balance            float           YES             NULL
shipto_customer         int(11)         NO      MUL     0
reference               varchar(10)     YES             NULL
journal_ref_number      int(11)         YES             NULL
next_month_flag         int(11)         YES             NULL
journal_type            varchar(15)     YES             NULL
activity_num            int(11)         YES             NULL
document_path           varchar(100)    YES             NULL
conditional_eft_approved char(1)        NO              N
customer_name           varchar(30)     YES             NULL
allow_web_payment       char(1)         YES             NULL
modify_date             datetime        NO              1950-01-01 12:00:00

默认情况是在路上是activity_date,delivery_date和due_date。有人可以解释发生了什么吗?

修改

源文件中的三行:

5830|2012-02-21|\N|29543|PAYMENT|\N|-600.5|0|0|0|-600.5|5830|505700|4807|0|Cash|0||N|TIME WARNE|N|2012-03-09 07:07:11
8057|2012-03-08|\N|32523|PAYMENT|\N|-1348.74|0|-1348.74|0|0|8057|1486|22|0|Cash|0||N|PACIFIC HA|N|2012-03-09 07:07:11
8103|2012-03-07|\N|32138|PAYMENT|\N|-1382.29|0|-1382.29|0|0|8103|3719|4|0|Cash|0||N|NORTH COUN|N|2012-03-09 07:07:11

相应的结果记录:

5830    2012-02-21      0000-00-00      29543   PAYMENT NULL    -600.5  0       0       0       -600.5  5830    505700  4807    0       Cash    0               N       TIME WARNE      N       2012-03-09 07:07:11
8057    2012-03-08      0000-00-00      32523   PAYMENT NULL    -1348.74        0       -1348.74        0       0       8057    1486    22      0       Cash    0               N       PACIFIC HA      N       2012-03-09 07:07:11
8103    2012-03-07      0000-00-00      32138   PAYMENT NULL    -1382.29        0       -1382.29        0       0       8103    3719    4       0       Cash    0               N       NORTH COUN      N       2012-03-09 07:07:11

2 个答案:

答案 0 :(得分:3)

如果将\N转换为空字符串,则INSERT命令将使用它,并且将忽略DEFAULT值。

我的意思是:

INSERT INTO table(customer, date) VALUES ("123", "")

然后date将包含0000-00-00。对于要使用的默认值,根本不应该为日期传递任何内容:

INSERT INTO table(customer) VALUES ("123")

答案 1 :(得分:1)

您的表可能允许为modify_date插入空值,这会导致数据时间字段的值为“0000-00-00 00:00:00”。您的infile中的列存在,但在某些情况下为空。当加载infile时,它会将列视为现有但没有值,将其视为null,因此值为'0000-00-00 00:00:00'。

编辑infile并删除列。如果实际为某些记录设置了值并且您无法删除该字段,则需要手动将“1950-01-01 12:00:00”添加到文件中的记录中,而不指定任何内容。