MySQL必知必會 資料插入(Insert)

2021-09-17 06:12:28 字數 3956 閱讀 6498

本篇文章介紹如何使用insert語句將資料插入到資料庫。

增刪改查是資料庫最常用的4個命令,插入算是第二常用,第一是select。插入資料的方式大概有4種

插入完整的行

插入行的一部分

插入多行資料(批量插入)

插入來自查詢的資料

使用insert將一條資料插入資料庫是最簡單也是最基本的操作。插入操作有兩種寫法。

順序插入指的是:給出資料庫名和需要插入資料,按照資料庫字段排列順序將資料插入資料庫。

舉個例子:

insert into `test`.`br_user` (`user_id`, `name`, `password`, `email`) values (null, '星空幻穎', '123456', '[email protected]');
這條語句向使用者表插入一條使用者資料。給出了姓名、密碼和郵箱3個字段,其中user_id設為null,這樣mysql就會為我們自動建立乙個自增長id

這種順序插入方式,必須和資料庫字段一一對應的給出每個值,如果不想給值,可以設為null(在資料允許的情況下)。由於位置匹配有要求,所以十分不安全。假設我們需要調增資料庫結構時候,此語句插入資料將會發生錯誤。所以一般情況下我們不採用這種方式。

首先給個例子:

insert into `test`.`br_user` (`user_id`, `name`, `password`, `email`) values (null, '星空幻穎', '123456', '[email protected]');
上面這條語句可以實現和順序插入一樣的功能,但我們發現它相比於順序插入多給出了欄位名,這種方式稍微複雜點兒,但是更為安全。

在插入資料行時候,mysql將會使用values的值填入對應欄位名,例如星空幻穎將會被插入到name字段。因為提供了欄位名,所以欄位的順序也不一定需要按照資料庫字段排序。

比方我們可以改寫上面的sql語句:

insert into `test`.`br_user` (`user_id`, `password`, `email`, `name`) values (null, '123456', '[email protected]', '星空幻穎');
我們將name調增到了最後乙個,但是這並不影響插入的結果。

甚至我們可以省去不寫某些欄位的值。(前提是字段允許為空或給出預設值的情況下)

insert into `test`.`br_user` (`password`, `name`) values ('123456', '星空幻穎');
這樣就安全了很多,即使我們調整資料庫結構,新增乙個字段,只要我們給出預設值就沒有任何問題。

mysql可以一次插入一條記錄到資料庫,也支援一次插入多條記錄。只需要給出多個values使用逗號分隔(使用圓括號括起來),就可以一次插入多條記錄。

insert into `test`.`br_user` (`user_id`, `password`, `email`, `name`) 

values (null, '123456', '[email protected]', '星空幻穎'),

(null, '123456', '[email protected]', '星空幻穎2'),

(null, '123456', '[email protected]', '星空幻穎3'),

(null, '123456', '[email protected]', '星空幻穎4');

注意每條插入值的順序要和你給出的字段順序一致。

建議:在實際開發中,如果需要插入多條資料盡量使用批量插入。因為速度比一條一條插入塊,效能更好。

假設乙個場景,我們有兩張使用者表,現在需要將其使用者進行合併。首先我們可能會想到,將一張表資料查出,在放入到另外一張表合併。

但是有了插入檢索出資料這個功能,就不需要這麼麻煩了。mysql可以一次幫我們處理好。

給出兩張表br_userbr_user2。為作區分,我把br_user2姓名都改為了數字

insert into br_user(`password`, `email`, `name`) select `password`, `email`, `name` from br_user2;
這條語句看上去好像是兩個語句,但是他執行的是乙個功能:將br_user2的資料挪到了br_user,一次性完成。

這裡的插入多少記錄到br_user決定了你的select檢索出來多少記錄,如果一條也沒有檢索到,也不會報錯,畢竟是合法的。當然,你也可以在select語句後面使用where條件篩選資料。

提醒:這裡複製資料到另外乙個表,最好不要使用原來的表id,防止和需要合併的表衝突,除非你確定不會衝突。還有字段型別,如果檢索出來為字串,而插入的為整型,mysql會幫你轉換了

上面的例子我們為了簡單明瞭,使用了兩張完全相同結構的表。其實mysql根本不關心你兩個表結構是否相同,也不關心你檢索的字段是否相同,只關心你檢索出來的字段順序。簡單來說,就是你檢索出來的第乙個欄位就會被插入到第乙個字段,(上方的password會被插入到password字段),以此類推。

為了演示這個效果,我們給出乙個驢唇不對馬嘴的兩張表,來展示強烈對比:

還是那張br_user,另外我們再給出一張br_region地區表,完全不一樣。

insert into br_user(`password`, `email`, `name`) select `region_py`, `region_type`, `region_name` from br_region where region_id <10;
由於br_region表資料量太大,我們只選取了region_id < 10的,剛好說了一下上面的附帶where篩選。

這裡region_py被放入了passwordregion_type被放入了emailregion_name被放入了name。他們有啥關係?啥關係都沒有。

這個為我們以後不同表之間轉移資料提供了方便。你可以幫老闆造假資料,來個10萬使用者。

星空幻穎,嚴穎

個人主頁:segmentfault

天天找資料找不到,噗噗噗,分享乙個資源合集**:筆點資源

mysql必知必會 mysql必知必會(四)

十四 理解子查詢 1 通過子查詢過濾 這本書在所有的章節都關連到了資料庫表,訂單資料是儲存在兩個表中,orders表儲存著 訂單號碼 顧客id和訂單日期。個人的訂單列表關連著orderitems表,訂單表沒有儲存顧客資訊,它只是儲存著顧客id,這實際的顧客資訊是儲存在customers表中。現在假設...

mysql的必知必會 mysql 必知必會 筆記

好久沒有寫了。1 show columns from table 等同於describe table顯示的是表的結構。而select from table 則顯示的是整個表中插入的資料。2 select distinct c1,c2 from table除非列不相同,否則所有行將被檢索出來,即不能對...

mysql必知必會

一周了,總想寫點什麼,有的時候進步真的很難在一周顯示出來,週三的時候,我跟我的領導說,好快啊,又週三了,不知不覺,他說是啊,現在對於他來說,有時候他過一天可能跟我過一周的感覺差不多,每天都在忙,時間過的特別快,也沒有感覺做出來點什麼,當然實際肯定是怎麼做了一些東西的,是否我以後也會如此呢?說說技術把...