2009-09-26 75 views
1

我正在將一些數據遷移到MySQL中,並且來自其他數據庫的轉儲已將特定日期字段留空。MySQL日期字段不包含任何值 - 導入問題

表看起來是這樣的:

+------------------+-------------+------+-----+------------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+------------------+-------------+------+-----+------------+-------+ 
| lngID   | int(11)  | NO | PRI | 0   |  | 
| dtmDateSubmitted | date  | NO |  | 0000-00-00 |  | 

該插入看起來是這樣的:

INSERT INTO tblReports VALUES (1012,'', ... 

這得到了傾倒了大量的記錄日期字段爲空,但表示爲:''

ERROR 1292 (22007) at line 1: 
Incorrect date value: '' for column 'dtmDateSubmitted' at row 1 

覺得有點愚蠢,因爲我真的從來沒有正確的理解空/空交易和文檔痛死我了:

當試圖導入此我得到下面的錯誤。

難道在MySQL中「日期」字段不允許在任何情況下''值?它需要是NULL? (爲了記錄,我嘗試了一堆零組合和默認選項之間的組合,無濟於事)。

通常情況下,我會將''更改爲NULL,以使此錯誤消失,但它似乎是錯誤的和駭人聽聞的。任何人都可以告訴我一個適當的/更好的方式來對待這是什麼?

我懷疑我可以從根本上誤解MySQL的工作方式,並與NULL更換''正確的方式來處理這個問題。

回答

1
  • 改變你的datetime列轉換爲VARCHAR。
  • 導入sql。
  • Update tbl set dtmDateSubmitted=NULL where dtmDateSubmitted='';
  • 將列更改回日期時間。
+0

這假設列接受空值。最佳實踐是儘可能少地執行DML操作。 – 2009-09-26 16:39:26

+0

只是用你想要的任何值替換null,無論如何它是原始插入中的空字符串。你會插入什麼? – Kane 2009-09-26 17:10:08

+0

der!真棒!謝謝。 – Williams 2009-09-27 04:46:02

0
INSERT INTO tblReports (lngID) VALUES (1012) 

應使用dtmDateSubmitted列的默認值。所以只是不要在插入語句中包含該列。

+0

有超過10K條記錄,我不情願要麼處理INSERT位或返回到客戶端 - 我真誠地希望這可以通過更改架構來解決。 雖然必須是,但它必須是。 – Williams 2009-09-26 12:31:33

+0

此外,此表中還有20個其他字段,因爲顯而易見的原因,我沒有在示例中包括:) – Williams 2009-09-26 12:32:48

0

那麼,如何你插入的數據?通過執行SQL語句或通過類似PHP的程序(它爲您生成插入語句)?

無論哪種方式,有一些關於那些做'插入日期字段和Aistina的建議是一個很好的一個。

問題是,''只是不是一個有效的日期,錯誤將是不可避免的。

你可以做一個批量編輯的SQL語句,如果這是你的方法?

也許使用正則表達式。

更改架構中提取數據時,肯定會造成問題 - 它不會改變之前提取的格式。

+0

直接導入MySQL。我有一個data.sql,我通過shell像這樣放入mysql: > mysql -ume -ppass mydb Williams 2009-09-26 12:54:56

+0

是的,Aistina的INSERT語句,在lngID值後面右側缺少'',不應該太難編輯(*着名的最後一個單詞*) – pavium 2009-09-26 13:02:57

+0

順便說一句,我不是說我不會再多說這個問題,我的意思是我可能會試圖說'應該不難編輯' – pavium 2009-09-26 14:02:46