我有一个带有一些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
答案 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”添加到文件中的记录中,而不指定任何内容。