使用INSERT語句插入新數據
語法:INSERT [INTO] tbl_name [(col_name,...)] VALUES (pression,...),…
INSERT [INTO] tbl_name SET col_name=expression, ...
讓我們開始利用 INSERT 語句來增加記錄,這是一個 SQL 語句,需要為它指定希望插入數據行的表或將值按行放入的表。INSERT 語句具有幾種形式:
可指定所有列的值:
例如:
shell> MySQL –u root –p
MySQL> use mytest;
MySQL> insert into worker values(“tom”,”[email protected]”);
“INTO”一詞自 MySQL 3.22.5 以來是可選的。(這一點對其他形式的 INSERT 語句也成立。)VALUES 表必須包含表中每列的值,並且按表中列的存放次序給出。(一般,這就是創建表時列的定義次序。如果不能肯定的話,可使用 DESCRIBE tbl_name 來查看這個次序。)
使用多個值表,可以一次提供多行數據。
MySQL>insert into worker values(‘tom’,’[email protected]’),(‘paul’,’[email protected]’);
有多個值表的INSERT ... VALUES的形式在MySQL 3.22.5或以後版本中支持。
可以給出要賦值的那個列,然後再列出值。這對於希望建立只有幾個列需要初始設置的記錄是很有用的。
例如:
MySQL>insert into worker (name) values (‘tom’);
自 MySQL 3.22.5 以來,這種形式的 INSERT 也允許多個值表:
MySQL>insert into worker (name) values (‘tom’), (‘paul’);
在列的列表中未給出名稱的列都將賦予缺省值。
自 MySQL 3.22 .10 以來,可以 col_name = value 的形式給出列和值。
例如:
MySQL>insert into worker set name=’tom’;
在 SET 子句中未命名的行都賦予一個缺省值。
使用這種形式的 INSERT 語句不能插入多行。
一個expression可以引用在一個值表先前設置的任何列。例如,你能這樣:
MySQL> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
但不能這樣:
MySQL> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
使用INSERT…SELECT語句插入從其他表選擇的行
當我們在上一節學習創建表時,知道可以使用select從其它表來直接創建表,甚至可以同時復制數據記錄。如果你已經擁有了一個表,你同樣可以從select語句的配合中獲益。
從其它表中錄入數據,例如:
MySQL>insert into tbl_name1(col1,col2) select col3,col4 from tbl_name2;
你也可以略去目的表的列列表,如果你每一列都有數據錄入。
MySQL>insert into tbl_name1 select col3,col4 from tbl_name2;
INSERT INTO ... SELECT語句滿足下列條件:
查詢不能包含一個ORDER BY子句。
INSERT語句的目的表不能出現在SELECT查詢部分的FROM子句,因為這在ANSI SQL中被禁止讓從你正在插入的表中SELECT。(問題是SELECT將可能發現在同一個運行期間內先前被插入的記錄。當使用子選擇子句時,情況能很容易混淆)
使用replace、replace…select語句插入
REPLACE功能與INSERT完全一樣,除了如果在表中的一個老記錄具有在一個唯一索引上的新記錄有相同的值,在新記錄被插入之前,老記錄被刪除。對於這種情況,insert語句的表現是產生一個錯誤。
REPLACE語句也可以褐SELECT相配合,所以上兩小節的內容完全適合REPALCE.。
應該注意的是,由於REPLACE語句可能改變原有的記錄,因此使用時要小心。
使用LOAD語句批量錄入數據
本章的前面討論如何使用SQL向一個表中插入數據。但是,如果你需要向一個表中添加許多條記錄,使用SQL語句輸入數據是很不方便的。幸運的是,MySQL提供了一些方法用於批量錄入數據,使得向表中添加數據變得容易了。本節以及下一節,將介紹這些方法。本節將介紹SQL語言級的解決方法。
1、基本語法
語法:LOAD DATA [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name LOAD DATA INFILE語句從一個文本文件中以很高的速度讀入一個表中。如果指定LOCAL關鍵詞,從客戶主機讀文件。如果LOCAL沒指定,文件必須位於服務器上。(LOCAL在MySQL3.22.6或以後版本中可用。)
為了安全原因,當讀取位於服務器上的文本文件時,文件必須處於數據庫目錄或可被所有人讀取。另外,為了對服務器上文件使用LOAD DATA INFILE,在服務器主機上你必須有file的權限。見第七章 數據庫安全。
REPLACE和IGNORE關鍵詞控制對現有的唯一鍵記錄的重復的處理。如果你指定REPLACE,新行將代替有相同的唯一鍵值的現有行。如果你指定IGNORE,跳過有唯一鍵的現有行的重復行的輸入。如果你不指定任何一個選項,當找到重復鍵鍵時,出現一個錯誤,並且文本文件的余下部分被忽略時。
如果你使用LOCAL關鍵詞從一個本地文件裝載數據,服務器沒有辦法在操作的當中停止文件的傳輸,因此缺省的行為好像IGNORE被指定一樣。
2、文件的搜尋原則
當在服務器主機上尋找文件時,服務器使用下列規則:
如果給出一個絕對路徑名,服務器使用該路徑名。
如果給出一個有一個或多個前置部件的相對路徑名,服務器相對服務器的數據目錄搜索文件。
如果給出一個沒有前置部件的一個文件名,服務器在當前數據庫的數據庫目錄尋找文件。
注意這些規則意味著一個像“./myfile.txt”給出的文件是從服務器的數據目錄讀取,而作為“myfile.txt”給出的一個文件是從當前數據庫的數據庫目錄下讀取。也要注意,對於下列哪些語句,對db1文件從數據庫目錄讀取,而不是db2:
MySQL> USE db1;
MySQL> LOAD DATA INFILE "./data.txt" INTO TABLE db2.my_table;
3、FIELDS和LINES子句的語法
如果你指定一個FIELDS子句,它的每一個子句(TERMINATED BY, [OPTIONALLY] ENCLOSED BY和ESCAPED BY)也是可選的,除了你必須至少指定他們之一。
如果你不指定一個FIELDS子句,缺省值與如果你這樣寫的相同:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
如果你不指定一個LINES子句,缺省值與如果你這樣寫的相同:
LINES TERMINATED BY '\n'
換句話說,缺省值導致讀取輸入時,LOAD DATA INFILE表現如下:
在換行符處尋找行邊界
在定位符處將行分進字段
不要期望字段由任何引號字符封裝
將由“\”開頭的定位符、換行符或“\”解釋是字段值的部分字面字符
LOAD DATA INFILE能被用來讀取從外部來源獲得的文件。例如,以DBase格式的文件將有由逗號分隔並用雙引號包圍的字段。如果文件中的行由換行符終止,下面顯示的命令說明你將用來裝載文件的字段和行處理選項:
MySQL> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
任何字段或行處理選項可以指定一個空字符串('')。如果不是空,FIELDS [OPTIONALLY] ENCLOSED BY和FIELDS ESCAPED BY值必須是一個單個字符。FIELDS TERMINATED BY和LINES TERMINATED BY值可以是超過一個字符。例如,寫入由回車換行符對(CR+LF)終止的行,或讀取包含這樣行的一個文件,指定一個LINES TERMINATED BY '\r\n'子句。
FIELDS [OPTIONALLY] ENCLOSED BY控制字段的包圍字符。對於輸出(SELECT ... INTO OUTFILE),如果你省略OPTIONALLY,所有的字段由ENCLOSED BY字符包圍。對於這樣的輸出的一個例子(使用一個逗號作為字段分隔符)顯示在下面:
"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"
如果你指定OPTIONALLY,ENCLOSED BY字符僅被用於包圍CHAR和VARCHAR字段:
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20
注意,一個字段值中的ENCLOSED BY字符的出現通過用ESCAPED BY字符作為其前綴來轉義。也要注意,如果你指定一個空ESCAPED BY值,可能產生不能被LOAD DATA INFILE正確讀出的輸出。例如,如果轉義字符為空,上面顯示的輸出顯示如下。注意到在第四行的第二個字段包含跟隨引號的一個逗號,它(錯誤地)好象要終止字段:
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20
FIELDS ESCAPED BY控制如何寫入或讀出特殊字符。如果FIELDS ESCAPED BY字符不是空的,它被用於前綴在輸出上的下列字符:
FIELDS ESCAPED BY字符
FIELDS [OPTIONALLY] ENCLOSED BY字符
FIELDS TERMINATED BY和LINES TERMINATED BY值的第一個字符
ASCII 0(實際上將後續轉義字符寫成 ASCII'0',而不是一個零值字節)
如果FIELDS ESCAPED BY字符是空的,沒有字符被轉義。指定一個空轉義字符可能不是一個好主意,特別是如果在你數據中的字段值包含剛才給出的表中的任何字符。
對於輸入,如果FIELDS ESCAPED BY字符不是空的,該字符的出現被剝去並且後續字符在字面上作為字段值的一個部分。例外是一個轉義的“0”或“N”(即,\0或\N,如果轉義字符是“\”)。這些序列被解釋為ASCII 0(一個零值字節)和NULL。見下面關於NULL處理的規則。
總結
為數據庫裝載數據是管理員的重要職責之一,正因為重要,所以MySQL提供的方法也是非常繁多。其中主要的在本節已經列舉:
1、使用INSERT、REPLACE語句
2、使用INSERT/REPLACE…SELECT語句
3、使用LOAD DATA INFILE語句
4、使用實用程序MySQLimport