2012-03-09 17 views
2

NULLの日付フィールドを持つパイプ区切りファイルがあります。このデータは、NULLの日付のデフォルト値を持つ一時表にロードされます。私の場合、私は1950年1月1日にデフォルトしたいと思っています。しかし、これらのデフォルトは一見上書きされており、0000-00-00が挿入されています。MySQL - デフォルトの日付の代わりにゼロ日付が挿入されました

私は私のソースファイルをgreppedと予想NULL日付が\ Nおよびファイル内に場所を持って確認している
#!/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 

パターン0000-00-00です:ここで私がテストを書いた迅速なbashスクリプトです。ここ

は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あります。誰かが何が起こっているか説明できますか?

EDIT:ソースファイルから

3行:

結果のレコードを対応
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

入力ファイルで使用されている日付形式は何ですか? – bfavaretto

+0

@bfavaretto:YYYY-MM-DD – btl

+0

明示的な 'ESCAPED BY '\\''はどうなりますか? – Wrikken

答えて

3

\Nの場合は、INSERTコマンドは、それを使用しますが、空の文字列に変換され、デフォルト値は無視されます。

私はこれで意味:その後、

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

date0000-00-00が含まれています。デフォルト値を使用する場合は、日付の何も渡す必要はありません。

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

私はテストの後、その正確な答えを投稿しようとしていました。私は確信していませんが、SQL Serverはこの場合、動作が異なると考えられます。カラムがNULL可能でない場合、NULLを渡すとデフォルト値が挿入されます。 MySQLの動作がちょっと変わったように見えます... – bfavaretto

+0

これはまさにそのようなケースです。投稿していただきありがとうございます。私はLOAD DATA INFILEを使って解決策を見つけたら更新します。 – btl

+0

私はそれが助けてくれてうれしいです。私はいくつかのテストを行い、NULL以外のカラムにNULL値を渡そうとすると、MySQLはエラーをスローすることを拒否しました。 –

1

あなたのテーブルには、おそらく、null値がMODIFY_DATEのために挿入することができますデータ型フィールドの値が '0000-00-00 00:00:00'になります。infileileのカラムは存在しますが、場合によっては空ですs。 infileがロードされると、列は存在するが値を持たないものとして扱われ、nullとして処理され、したがって '0000-00-00 00:00:00'という値になります。

infileを編集して列を削除します。一部のレコードで値が実際に設定されていて、フィールドを削除できない場合は、何も指定せずにファイル内のレコードに手動で '1950-01-01 12:00:00'を追加する必要があります。

+0

modify_dateはNULL値と1950-01 -01 12:00:00。 – btl

関連する問題