官术网_书友最值得收藏!

4.1 插入數(shù)據(jù)

在使用數(shù)據(jù)庫之前,數(shù)據(jù)庫中必須要有數(shù)據(jù),MySQL中使用INSERT語句向數(shù)據(jù)庫表中插入新的數(shù)據(jù)記錄。可以插入的方式有:插入完整的記錄、插入記錄的一部分、插入多條記錄、插入另一個查詢的結(jié)果。下面將分別介紹這些內(nèi)容。

4.1.1 為表的所有字段插入數(shù)據(jù)

使用基本的INSERT語句插入數(shù)據(jù)要求指定表名稱和插入新記錄中的值。基本語法格式為:

     INSERT INTO table_name (column_list) VALUES (value_list);

table_name指定要插入數(shù)據(jù)的表名,column_list指定要插入數(shù)據(jù)的那些列,value_list指定每個列對應(yīng)插入的數(shù)據(jù)。注意,使用該語句時字段列和數(shù)據(jù)值的數(shù)量必須相同。

本章將使用樣例表person,創(chuàng)建語句如下:

向表中所有字段插入值的方法有兩種:一種是指定所有字段名;另一種是完全不指定字段名。

【例4.1】在person表中插入一條新記錄,id值為1,name值為Green,age值為21,info值為Lawyer,SQL語句如下:

執(zhí)行插入操作之前,使用SELECT語句查看表中的數(shù)據(jù):

結(jié)果顯示當(dāng)前表為空,沒有數(shù)據(jù)。接下來執(zhí)行插入操作:

語句執(zhí)行完畢,查看執(zhí)行結(jié)果:

可以看到插入記錄成功。在插入數(shù)據(jù)時,指定了person表的所有字段,因此將為每一個字段插入新的值。

INSERT語句后面的列名稱順序可以不是person表定義時的順序。即插入數(shù)據(jù)時,不需要按照表定義的順序插入,只要保證值的順序與列字段的順序相同就可以,如【例4.2】所示。

【例4.2】在person表中插入一條新記錄,id值為2,name值為Suse,age值為22,info值為dancer,SQL語句如下:

語句執(zhí)行完畢,查看執(zhí)行結(jié)果:

由結(jié)果可以看到,INSERT語句成功插入了一條記錄。

使用INSERT插入數(shù)據(jù)時,允許列名稱列表column_list為空,此時,值列表中需要為表的每一個字段指定值,并且值的順序必須和數(shù)據(jù)表中字段定義時的順序相同,如【例4.3】所示。

【例4.3】在person表中插入一條新記錄,id值為3,name值為Mary,age值為24,info值為Musician,SQL語句如下:

     mysql> INSERT INTO person  VALUES (3,'Mary', 24, 'Musician');

語句執(zhí)行完畢,查看執(zhí)行結(jié)果:

可以看到插入記錄成功。數(shù)據(jù)庫中增加了一條id為3的記錄,其他字段值為指定的插入值。本例的INSERT語句中沒有指定插入列表,只有一個值列表。在這種情況下,值列表為每一個字段列指定插入值,并且這些值的順序必須和person表中字段定義的順序相同。

提示

雖然使用INSERT插入數(shù)據(jù)時可以忽略插入數(shù)據(jù)的列名稱,但是值如果不包含列名稱,那么VALUES關(guān)鍵字后面的值不僅要求完整,而且順序必須和表定義時列的順序相同。如果表的結(jié)構(gòu)被修改,那么對列進行增加、刪除或者位置改變操作,這些操作將使得用這種方式插入數(shù)據(jù)時的順序也同時改變。如果指定列名稱,則不會受到表結(jié)構(gòu)改變的影響。

4.1.2 為表的指定字段插入數(shù)據(jù)

為表的指定字段插入數(shù)據(jù),就是在INSERT語句中只向部分字段中插入值,而其他字段的值為表定義時的默認(rèn)值。

【例4.4】在person表中插入一條新記錄,name值為Willam,age值為20,info值為sports man,SQL語句如下:

提示信息表示插入一條記錄成功。使用SELECT查詢表中的記錄,查詢結(jié)果如下:

可以看到插入記錄成功。如查詢結(jié)果顯示,該id字段自動添加了一個整數(shù)值4。在這里id字段為表的主鍵,不能為空,系統(tǒng)會自動為該字段插入自增的序列值。在插入記錄時,如果某些字段沒有指定插入值,那么MySQL將插入該字段定義時的默認(rèn)值。下面的例子說明在沒有指定列字段時,插入默認(rèn)值。

【例4.5】在person表中插入一條新記錄,name值為Laura,age值為25,SQL語句如下:

     mysql> INSERT INTO person (name, age ) VALUES ('Laura', 25);

語句執(zhí)行完畢,查看執(zhí)行結(jié)果,

可以看到,在本例的插入語句中,沒有指定info字段值,查詢結(jié)果顯示,info字段在定義時默認(rèn)為NULL,因此系統(tǒng)自動為該字段插入空值。

提示

要保證每個插入值的類型和對應(yīng)列的數(shù)據(jù)類型匹配,如果類型不同,就無法插入,并且MySQL會產(chǎn)生錯誤。

4.1.3 同時插入多條記錄

INSERT語句可以同時向數(shù)據(jù)表中插入多條記錄,插入時指定多個值列表,每個值列表之間用逗號分隔開,基本語法格式如下:

value_list1,value_list2,…,value_listn;表示第1,2,…,n個插入記錄的字段的值列表。

【例4.6】在person表中,在name、age和info字段指定插入值,同時插入3條新記錄,SQL語句如下:

語句執(zhí)行完畢,查看執(zhí)行結(jié)果:

由結(jié)果可以看到,INSERT語句執(zhí)行后,person表中添加了3條記錄,其name和age字段分別為指定的值,id字段為MySQL添加的默認(rèn)自增值。

使用INSERT同時插入多條記錄時,MySQL會返回一些在執(zhí)行單行插入時沒有的額外信息,這些信息的含義如下:

? Records:表明插入的記錄條數(shù)。

? Duplicates:表明插入時被忽略的記錄,原因可能是這些記錄包含重復(fù)的主鍵值。

? Warnings:表明有問題的數(shù)據(jù)值,例如發(fā)生數(shù)據(jù)類型轉(zhuǎn)換。

【例4.7】在person表中,不指定插入列表,同時插入兩條新記錄,SQL語句如下:

語句執(zhí)行結(jié)果如下:

語句執(zhí)行完畢,查看執(zhí)行結(jié)果:

由結(jié)果可以看到,INSERT語句執(zhí)行后,person表中添加了兩條記錄,與前面介紹單個INSERT語法不同,person表名后面沒有指定插入字段列表,因此,VALUES關(guān)鍵字后面的多個值列表都要為每一條記錄的每一個字段列指定插入值,并且這些值的順序必須和person表中字段定義的順序相同,帶有AUTO_INCREMENT屬性的id字段插入NULL值,系統(tǒng)會自動為該字段插入唯一的自增編號。

提示

一個同時插入多行記錄的INSERT語句等同于多個單行插入的INSERT語句,但是多行的INSERT語句在處理過程中效率更高。因為MySQL執(zhí)行單條INSERT語句插入多行數(shù)據(jù)比使用多條INSERT語句快,所以在插入多條記錄時,最好選擇使用單條INSERT語句的方式插入。

4.1.4 將查詢結(jié)果插入表中

INSERT語句用來給數(shù)據(jù)表插入記錄時,指定插入記錄的列值。INSERT還可以將SELECT語句查詢的結(jié)果插入表中,如果想要從另一個表中合并個人信息到person表,那么不需要把每一條記錄的值一個一個輸入,只需要使用一條INSERT語句和一條SELECT語句組成的組合語句,即可快速地從一個或多個表中向一個表中插入多個行。基本語法格式如下:

table_name1指定待插入數(shù)據(jù)的表;column_list1指定待插入表中要插入數(shù)據(jù)的哪些列;table_name2指定插入數(shù)據(jù)是從哪個表中查詢出來的;column_list2指定數(shù)據(jù)來源表的查詢列,該列表必須和column_list1列表中的字段個數(shù)相同,數(shù)據(jù)類型相同;condition指定SELECT語句的查詢條件。

【例4.8】從person_old表中查詢所有的記錄,并將其插入person表中。

首先,創(chuàng)建一個名為person_old的數(shù)據(jù)表,其表結(jié)構(gòu)與person表結(jié)構(gòu)相同,SQL語句如下:

向person_old表中添加兩條記錄:

可以看到,插入記錄成功,person_old表中現(xiàn)在有兩條記錄。接下來,將person_old表中所有的記錄插入person表中,SQL語句如下:

語句執(zhí)行完畢,查看執(zhí)行結(jié)果:

由結(jié)果可以看到,INSERT語句執(zhí)行后,person表中多了兩條記錄,這兩條記錄和person_old表中的記錄完全相同,數(shù)據(jù)轉(zhuǎn)移成功。這里的id字段為自增的主鍵,在插入的時候要保證該字段值的唯一性,如果不能確定,那么在插入的時候可以忽略該字段,只插入其他字段的值。

提示

這個例子中使用的person_old表和person表的定義相同。事實上,MySQL不關(guān)心SELECT返回的列名,它根據(jù)列的位置進行插入,SELECT的第1列對應(yīng)待插入表的第1列,第2列對應(yīng)待插入表的第2列,等等。即使不同結(jié)果的表之間也可以方便地轉(zhuǎn)移數(shù)據(jù)。

主站蜘蛛池模板: 江口县| 龙陵县| 肇东市| 永和县| 光泽县| 化州市| 双流县| 仁寿县| 巴里| 武汉市| 蓬溪县| 大竹县| 三门县| 洮南市| 抚远县| 涟水县| 馆陶县| 江口县| 长岛县| 汪清县| 皮山县| 璧山县| 金湖县| 旺苍县| 徐水县| 隆昌县| 沙湾县| 武义县| 泸水县| 遵义县| 明光市| 武冈市| 大厂| 遂宁市| 志丹县| 逊克县| 肇庆市| 马尔康县| 荔浦县| 普兰县| 比如县|