国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

向MySQL數(shù)據(jù)表插入行記錄(INSERT)

2024-07-24 12:58:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

摘要:為數(shù)據(jù)庫(kù)裝載數(shù)據(jù)是管理員的重要職責(zé)之一,正因?yàn)橹匾訫ySQL提供的方法也是非常繁多。其中主要使用INSERT和LOAD語(yǔ)句

使用INSERT語(yǔ)句插入新數(shù)據(jù)

語(yǔ)法:INSERT [INTO] tbl_name [(col_name,...)] VALUES (PRession,...),…
      INSERT [INTO] tbl_name SET col_name=expression, ...

讓我們開(kāi)始利用 INSERT 語(yǔ)句來(lái)增加記錄,這是一個(gè) SQL 語(yǔ)句,需要為它指定希望插入數(shù)據(jù)行的表或?qū)⒅蛋葱蟹湃氲谋怼NSERT 語(yǔ)句具有幾種形式:

可指定所有列的值:

例如:

shell> mysql –u root –p
mysql> use mytest;
mysql> insert into worker values(“tom”,”tom@yahoo.com”);


“INTO”一詞自 MySQL 3.22.5 以來(lái)是可選的。(這一點(diǎn)對(duì)其他形式的 INSERT 語(yǔ)句也成立。)VALUES 表必須包含表中每列的值,并且按表中列的存放次序給出。(一般,這就是創(chuàng)建表時(shí)列的定義次序。如果不能肯定的話,可使用 DESCRIBE tbl_name 來(lái)查看這個(gè)次序。)

使用多個(gè)值表,可以一次提供多行數(shù)據(jù)。

Mysql>insert into worker values(‘tom’,’tom@yahoo.com’),(‘paul’,’paul@yahoo.com’);

有多個(gè)值表的INSERT ... VALUES的形式在MySQL 3.22.5或以后版本中支持。

可以給出要賦值的那個(gè)列,然后再列出值。這對(duì)于希望建立只有幾個(gè)列需要初始設(shè)置的記錄是很有用的。

例如:

mysql>insert into worker (name) values (‘tom’);

自 MySQL 3.22.5 以來(lái),這種形式的 INSERT 也允許多個(gè)值表:

mysql>insert into worker (name) values (‘tom’), (‘paul’);

在列的列表中未給出名稱的列都將賦予缺省值。

自 MySQL 3.22 .10 以來(lái),可以 col_name = value 的形式給出列和值。

例如:

mysql>insert into worker set name=’tom’;

在 SET 子句中未命名的行都賦予一個(gè)缺省值。

使用這種形式的 INSERT 語(yǔ)句不能插入多行。

一個(gè)expression可以引用在一個(gè)值表先前設(shè)置的任何列。例如,你能這樣:

mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);

但不能這樣:

mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);

使用INSERT…SELECT語(yǔ)句插入從其他表選擇的行

當(dāng)我們?cè)谏弦还?jié)學(xué)習(xí)創(chuàng)建表時(shí),知道可以使用select從其它表來(lái)直接創(chuàng)建表,甚至可以同時(shí)復(fù)制數(shù)據(jù)記錄。如果你已經(jīng)擁有了一個(gè)表,你同樣可以從select語(yǔ)句的配合中獲益。

從其它表中錄入數(shù)據(jù),例如:

mysql>insert into tbl_name1(col1,col2) select col3,col4 from tbl_name2;

你也可以略去目的表的列列表,如果你每一列都有數(shù)據(jù)錄入。

mysql>insert into tbl_name1 select col3,col4 from tbl_name2;

INSERT INTO ... SELECT語(yǔ)句滿足下列條件:

查詢不能包含一個(gè)ORDER BY子句。

INSERT語(yǔ)句的目的表不能出現(xiàn)在SELECT查詢部分的FROM子句,因?yàn)檫@在ANSI SQL中被禁止讓從你正在插入的表中SELECT。(問(wèn)題是SELECT將可能發(fā)現(xiàn)在同一個(gè)運(yùn)行期間內(nèi)先前被插入的記錄。當(dāng)使用子選擇子句時(shí),情況能很容易混淆)

使用replace、replace…select語(yǔ)句插入

REPLACE功能與INSERT完全一樣,除了如果在表中的一個(gè)老記錄具有在一個(gè)唯一索引上的新記錄有相同的值,在新記錄被插入之前,老記錄被刪除。對(duì)于這種情況,insert語(yǔ)句的表現(xiàn)是產(chǎn)生一個(gè)錯(cuò)誤。

REPLACE語(yǔ)句也可以褐SELECT相配合,所以上兩小節(jié)的內(nèi)容完全適合REPALCE.。

應(yīng)該注意的是,由于REPLACE語(yǔ)句可能改變?cè)械挠涗洠虼耸褂脮r(shí)要小心。

使用LOAD語(yǔ)句批量錄入數(shù)據(jù)

本章的前面討論如何使用SQL向一個(gè)表中插入數(shù)據(jù)。但是,如果你需要向一個(gè)表中添加許多條記錄,使用SQL語(yǔ)句輸入數(shù)據(jù)是很不方便的。幸運(yùn)的是,MySQL提供了一些方法用于批量錄入數(shù)據(jù),使得向表中添加數(shù)據(jù)變得容易了。本節(jié)以及下一節(jié),將介紹這些方法。本節(jié)將介紹SQL語(yǔ)言級(jí)的解決方法。

1、基本語(yǔ)法

語(yǔ)法:LOAD DATA [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name LOAD DATA INFILE語(yǔ)句從一個(gè)文本文件中以很高的速度讀入一個(gè)表中。如果指定LOCAL關(guān)鍵詞,從客戶主機(jī)讀文件。如果LOCAL沒(méi)指定,文件必須位于服務(wù)器上。(LOCAL在MySQL3.22.6或以后版本中可用。)

為了安全原因,當(dāng)讀取位于服務(wù)器上的文本文件時(shí),文件必須處于數(shù)據(jù)庫(kù)目錄或可被所有人讀取。另外,為了對(duì)服務(wù)器上文件使用LOAD DATA INFILE,在服務(wù)器主機(jī)上你必須有file的權(quán)限。見(jiàn)第七章 數(shù)據(jù)庫(kù)安全。

REPLACE和IGNORE關(guān)鍵詞控制對(duì)現(xiàn)有的唯一鍵記錄的重復(fù)的處理。如果你指定REPLACE,新行將代替有相同的唯一鍵值的現(xiàn)有行。如果你指定IGNORE,跳過(guò)有唯一鍵的現(xiàn)有行的重復(fù)行的輸入。如果你不指定任何一個(gè)選項(xiàng),當(dāng)找到重復(fù)鍵鍵時(shí),出現(xiàn)一個(gè)錯(cuò)誤,并且文本文件的余下部分被忽略時(shí)。

如果你使用LOCAL關(guān)鍵詞從一個(gè)本地文件裝載數(shù)據(jù),服務(wù)器沒(méi)有辦法在操作的當(dāng)中停止文件的傳輸,因此缺省的行為好像IGNORE被指定一樣。

2、文件的搜尋原則

當(dāng)在服務(wù)器主機(jī)上尋找文件時(shí),服務(wù)器使用下列規(guī)則:

如果給出一個(gè)絕對(duì)路徑名,服務(wù)器使用該路徑名。

如果給出一個(gè)有一個(gè)或多個(gè)前置部件的相對(duì)路徑名,服務(wù)器相對(duì)服務(wù)器的數(shù)據(jù)目錄搜索文件。

如果給出一個(gè)沒(méi)有前置部件的一個(gè)文件名,服務(wù)器在當(dāng)前數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)目錄尋找文件。

注意這些規(guī)則意味著一個(gè)像“./myfile.txt”給出的文件是從服務(wù)器的數(shù)據(jù)目錄讀取,而作為“myfile.txt”給出的一個(gè)文件是從當(dāng)前數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)目錄下讀取。也要注意,對(duì)于下列哪些語(yǔ)句,對(duì)db1文件從數(shù)據(jù)庫(kù)目錄讀取,而不是db2:

mysql> USE db1;
mysql> LOAD DATA INFILE "./data.txt" INTO TABLE db2.my_table;


3、FIELDS和LINES子句的語(yǔ)法

如果你指定一個(gè)FIELDS子句,它的每一個(gè)子句(TERMINATED BY, [OPTIONALLY] ENCLOSED BY和ESCAPED BY)也是可選的,除了你必須至少指定他們之一。

如果你不指定一個(gè)FIELDS子句,缺省值與如果你這樣寫的相同:

FIELDS TERMINATED BY '/t' ENCLOSED BY '' ESCAPED BY '//'

如果你不指定一個(gè)LINES子句,缺省值與如果你這樣寫的相同:

LINES TERMINATED BY '/n'

換句話說(shuō),缺省值導(dǎo)致讀取輸入時(shí),LOAD DATA INFILE表現(xiàn)如下:

在換行符處尋找行邊界

在定位符處將行分進(jìn)字段

不要期望字段由任何引號(hào)字符封裝

將由“/”開(kāi)頭的定位符、換行符或“/”解釋是字段值的部分字面字符

LOAD DATA INFILE能被用來(lái)讀取從外部來(lái)源獲得的文件。例如,以dBASE格式的文件將有由逗號(hào)分隔并用雙引號(hào)包圍的字段。如果文件中的行由換行符終止,下面顯示的命令說(shuō)明你將用來(lái)裝載文件的字段和行處理選項(xiàng):

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name

FIELDS TERMINATED BY ',' ENCLOSED BY '"'

LINES TERMINATED BY '/n';


任何字段或行處理選項(xiàng)可以指定一個(gè)空字符串('')。如果不是空,F(xiàn)IELDS [OPTIONALLY] ENCLOSED BY和FIELDS ESCAPED BY值必須是一個(gè)單個(gè)字符。FIELDS TERMINATED BY和LINES TERMINATED BY值可以是超過(guò)一個(gè)字符。例如,寫入由回車換行符對(duì)(CR+LF)終止的行,或讀取包含這樣行的一個(gè)文件,指定一個(gè)LINES TERMINATED BY '/r/n'子句。

FIELDS [OPTIONALLY] ENCLOSED BY控制字段的包圍字符。對(duì)于輸出(SELECT ... INTO OUTFILE),如果你省略O(shè)PTIONALLY,所有的字段由ENCLOSED BY字符包圍。對(duì)于這樣的輸出的一個(gè)例子(使用一個(gè)逗號(hào)作為字段分隔符)顯示在下面:

"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

注意,一個(gè)字段值中的ENCLOSED BY字符的出現(xiàn)通過(guò)用ESCAPED BY字符作為其前綴來(lái)轉(zhuǎn)義。也要注意,如果你指定一個(gè)空ESCAPED BY值,可能產(chǎn)生不能被LOAD DATA INFILE正確讀出的輸出。例如,如果轉(zhuǎn)義字符為空,上面顯示的輸出顯示如下。注意到在第四行的第二個(gè)字段包含跟隨引號(hào)的一個(gè)逗號(hào),它(錯(cuò)誤地)好象要終止字段:

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值的第一個(gè)字符

ASCII 0(實(shí)際上將后續(xù)轉(zhuǎn)義字符寫成 ASCII'0',而不是一個(gè)零值字節(jié))

如果FIELDS ESCAPED BY字符是空的,沒(méi)有字符被轉(zhuǎn)義。指定一個(gè)空轉(zhuǎn)義字符可能不是一個(gè)好主意,特別是如果在你數(shù)據(jù)中的字段值包含剛才給出的表中的任何字符。

對(duì)于輸入,如果FIELDS ESCAPED BY字符不是空的,該字符的出現(xiàn)被剝?nèi)ゲ⑶液罄m(xù)字符在字面上作為字段值的一個(gè)部分。例外是一個(gè)轉(zhuǎn)義的“0”或“N”(即,/0或/N,如果轉(zhuǎn)義字符是“ /”)。這些序列被解釋為ASCII 0(一個(gè)零值字節(jié))和NULL。見(jiàn)下面關(guān)于NULL處理的規(guī)則。

總結(jié)

為數(shù)據(jù)庫(kù)裝載數(shù)據(jù)是管理員的重要職責(zé)之一,正因?yàn)橹匾訫ySQL提供的方法也是非常繁多。其中主要的在本節(jié)已經(jīng)列舉:

1、使用INSERT、REPLACE語(yǔ)句

2、使用INSERT/REPLACE…SELECT語(yǔ)句

3、使用LOAD DATA INFILE語(yǔ)句

4、使用實(shí)用程序mysqlimport


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南阳市| 乡宁县| 古丈县| 密云县| 潮安县| 蓬莱市| 邢台市| 黔江区| 神木县| 新营市| 二连浩特市| 康马县| 塘沽区| 科技| 景洪市| 蓬莱市| 临城县| 南漳县| 藁城市| 湖北省| 乳源| 贞丰县| 汽车| 萝北县| 禹州市| 阳高县| 汝南县| 平利县| 南皮县| 鞍山市| 苏尼特左旗| 肥西县| 绥中县| 平陆县| 库伦旗| 宜宾县| 迁安市| 洞头县| 郸城县| 峡江县| 阿图什市|