使用LOAD DATA和INSERT语句导入Mysql数据
在“MySQL數據庫(表)的基本操作”一節中我們創建過一個會員注冊表“Users”,這次我們就往這個表中以不同的方式導入數據。
INSERT語句
???? 關于INSERT語句,這里簡單講述兩個常用的句子結構。INSERT把新行插入到一個存在的表中,INSERTINTO... VALUES形式的語句是明確指定插入行的值,INSERT INTO SELECT形式是插入從其他表選擇行的值。
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES (expression,...)
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
???? 如果指定關鍵詞LOW_PRIORITY或DELAYED時,INSERT的執行將等待表沒有其他讀寫操作時進行。
???? 如果指定關鍵詞IGNORE,表中存在任何重復的PRIMARY或UNIQUE鍵的行將被忽略而不插入。如果不指定IGNORE關鍵詞,若出現重復的行時會被放棄執行。
當使用INSERT INTO SELECT形式的語句時,需要滿足下列條件:
(1) 查詢不能包含一個ORDER BY子句。
(2)INSERT語句的目的表不能與SELECT查詢部分的FROM表重復。
插入數據時常發生的錯誤:
(1)插入NULL到被聲明了NOT NULL的列,列被設置為它的缺省值。
(2)將超出列范圍的值設置給一個數字列,值被剪切為范圍內適當的端點值。
(3)將數字列設成例如'10.34 a'的值,拖尾的垃圾被剝去并仍然是數字部分被插入。如果值根本不是一個數字,列被設置到0。
(4)把一個字符串插入到超過列的最大長度的一個CHAR、VARCHAR、TEXT或BLOB列中。值被截斷為列的最大長度。
(5)把一個對列類型不合法的值插入到一個日期或時間列。列被設置為該列類型適當的“零”值。
案例:(使用INSERT語句向“Users”表中插入一條數據)
mysql>insert?into?users(username,userpassword,createdate)?values("feihu",?->password("123456"),"2009.9.22?14:30:10");?Query?OK,1?row?affected?(0.00?sec)?通過上面的語句已寫入成功,再用select語句查驗一下:
注:這里的password()函數是為了給輸入的字符加密。當需要一次插入多條數據時,可這個方式:“insert into users(username,userpassword,createdate) values('value1','password1','date1'),('value2','password2','date2'), ('value3','password3','date3')”。
LOAD DATA批處理式導入數據
當寫入多行數據時,使用INSERT就現得很累了。較之快捷的方法是將多行的數據寫入一個文本文檔,然后使用LOAD DATA語句讀取數據,批量寫入到數據表中。在創建這個文檔時,要遵從以下規則:
(1)每行包含一個記錄
(2)對應導入數據表的列次序,用定位符(tab)把值分開
(3)對于NULL值,可以使用\N(反斜線,字母N)表示。
LOAD DATA語法:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char' ]
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
(1) 如果指定了關鍵詞low_priority,那么MySQL將會等到沒有其他人讀這個表的時候,才會插入數據。load?data?low_priority?local?infile?"D:/user.txt"?into?table?users;?
(2) 如果指定local關鍵詞,則表明從客戶主機上按路徑讀取文件。如果沒有指定,則文件在服務器上按路徑讀取文件。
(3) replace和ignore關鍵詞控制對現有的唯一鍵記錄的重復處理。如果你指定 了replace關鍵字,則重復的新行將代替已有的行。如果指定了ignore關鍵字,則會放棄寫入有唯一鍵的現有行而繼續下一行記錄的寫入操作。如果不 指定任何一個選項,當找到重復鍵時,出現一個錯誤,并且寫入操作將被迫停止。例如:
load?data?local?infile?"D:/user.txt"?replace?into?table?users;?
(4)兩個命令的 FIELDS 和 LINES 子句的語法是一樣的。兩個子句都是可選的,但是如果兩個同時被指定,FIELDS 子句必須出現在 LINES 子句之前。
(5)如果用戶指定一個 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可選的,不過,用戶必須至少指定它們中的一個。其意義為:
TERMINATED BY??? 描述字段的分隔符,默認情況下是tab字符(\t)
[OPTIONALLY] ENCLOSED BY??? 描述的是字段的括起字符
ESCAPED BY????? 轉義字符
用戶在沒有指定一個 FIELDS 子句,缺省時如同使用下列語句:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
(6)關鍵字LINES的兩個子句的意義為:
STARTING BY 'string'?????? 一條記錄行的開始字符標記
TERMINATED BY 'string'???? 一條記錄行的結束字符標記
如果用戶沒有指定一個 LINES 子句,缺省時如同使用下列語句:
LINES TERMINATED BY '\n' STARTING BY ''
案例:(用LOAD DATA語句導入10條數據)
D:/user.txt文件:
Xiaozhang??? 123456??? 2009.9.22 16:21:10
Xiaozhao??? ??? 123456??? 2009.9.22 16:21:11
Xiaoming??? ??? 123456??? 2009.9.22 16:21:12
Xiaohao??? ??? 123456??? 2009.9.22 16:21:13
Xiaoqing??? ??? 123456??? 2009.9.22 16:21:14
Xiaoren??? ??? 123456??? 2009.9.22 16:21:15
Xiaozhen??? ??? 123456??? 2009.9.22 16:21:16
Xiaojing??? ??? 123456??? 2009.9.22 16:21:17
Xiaojin??? ??? 123456??? 2009.9.22 16:21:18
Xiaohong??? ??? 123456??? 2009.9.22 16:21:19
MySQL寫入語句:
mysql>load?data?local?infile?“d:/user.txt”?into?table?users;?Query?OK,10?rows?affected?(0.02?sec)?Records:10?Deleted:0?Skipped:0?Warnings:0?出現上面語句,表示執行成功,再使用行成功,再使用select語句查看下結果:
與LOAD DATA語句相反意思的是SELECT ... INTO OUTFILE,即:從MySQL數據表中導出文本文檔。請繼續關注本站。
?
?
制作人:飛虎?????????????????????????????????????????? 無兄弟不編程!
====================================================
?
歡迎加QQ群進行更多交流:305397511???? 專注于php、mysql以及開源框架
?
?
轉載于:https://www.cnblogs.com/jishume/articles/2026348.html
總結
以上是生活随笔為你收集整理的使用LOAD DATA和INSERT语句导入Mysql数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 敢笑黄巢不丈夫是什么意思
- 下一篇: 快餐营销语29句