參考:https://blog.csdn.net/u012815136/article/details/88953289
load data 簡介
- MySQL load data 語句能快速將一個文本文件的內容導入到對應的數據庫表中(一般文本的一行對應表的一條記錄)。
- 數據庫應用程序開發中,涉及大批量數據需要插入時,使用 load data 語句的效率比一般的 insert 語句的高很多
- 可以看成select … into outfile語句的反操作,select … into outfile將數據庫表中的數據導出保存到一個文件中。參考MySQL 5.7 官方手冊 SELECT … INTO Syntax
load data 語法
load data 語法如下,詳細情況可參考 MySQL 5.7 官方手冊 LOAD DATA Syntax
LOAD DATA
[LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var
[, col_name_or_user_var] ...)]
[SET col_name={expr | DEFAULT},
[, col_name={expr | DEFAULT}] ...]
load data 使用細節
使用示例
假如有一個用戶信息表
CREATE TABLE `user_info` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(36) NULL COMMENT '姓名',
`age` int NULL COMMENT '年齡',
`address` varchar(255) NULL COMMENT '地址',
`create_date` datetime NULL COMMENT '創建時間',
PRIMARY KEY (`id`)
)
COMMENT='用戶信息表'
;
假如待導入用戶信息表的文本文件名為 my_user_info.txt,內容如下所示,換行符采用 \n ,每行代表對應表的一行記錄,其中 || 作為字段分隔符,而 \N 表示對應字段為空值 null
3||張三||22||北京||2012-09-19 00:00:00
4||李明||32||\N||2017-05-12 00:00:00
5||孫權||12||廣州||\N
執行 load data 將用戶信息導入表user_info中
load data local infile 'D:/my_user_info.txt' into table user_info
CHARACTER SET utf8 -- 可選,避免中文亂碼問題
FIELDS TERMINATED BY '||' -- 字段分隔符,每個字段(列)以什么字符分隔,默認是 \t
OPTIONALLY ENCLOSED BY '' -- 文本限定符,每個字段被什么字符包圍,默認是空字符
ESCAPED BY '\\' -- 轉義符,默認是 \
LINES TERMINATED BY '\n' -- 記錄分隔符,如字段本身也含\n,那么應先去除,否則load data 會誤將其視作另一行記錄進行導入
(id, name, age, address, create_date) -- 每一行文本按順序對應的表字段,建議不要省略
執行成功后,查詢表user_info數據,如下圖所示
注意事項
-
字段中的空值 null 需要使用 \N 表示,如果用空字符串表示,那么根據不同的數據類型,MySQL 處理也各異
- 數據庫字段如果是varchar/char,插入空時,load data 默認導入 空字符串
- 數據庫字段如果是decimal,插入空時,load data 默認導入 0.00000000
- 數據庫字段如果是datetime,插入空時,load data 默認導入 0000-00-00 00:00:00
-
字段類型如果是datetime,應該嚴格把控相應文本數據的格式,建議采用類似這種 yyyy-MM-dd HH:mm:ss 同時有日期、時間的格式,否則難以保證數據導入的正確性
- 數據庫字段如果是datetime,插入yyyy-MM-dd時,load data 默認導入 yyyy-MM-dd 00:00:00,數據正確性能夠保證
- 數據庫字段如果是datetime,插入HH:mm:ss時,load data 默認導入 0000-00-00 00:00:00,數據正確性不能夠保證
-
local關鍵字
如果 load data 使用時指定了 local 關鍵字,則表示文件放在客戶端主機上,從客戶端讀取文本文件;如果沒指定,則表示從服務器主機讀取文本文件
-
replace 和 ignore 關鍵字
- replace 和 ignore 關鍵字用於控制與唯一鍵重復的記錄的處理
- 如果指定 replace ,與唯一鍵重復的行將被覆蓋更新。對於任意記錄覆蓋更新時,如果唯一鍵外的各個字段其實都沒有變化,那么執行操作時受影響行數為1;如果除唯一鍵外的任意字段有變化,那么執行操作時受影響行數為2
- 如果指定 ignore ,與唯一鍵重復的行將被忽略,默認指定 ignore