本篇文章介紹如何使用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_user
和br_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
被放入了password
;region_type
被放入了email
;region_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必知必會
一周了,總想寫點什麼,有的時候進步真的很難在一周顯示出來,週三的時候,我跟我的領導說,好快啊,又週三了,不知不覺,他說是啊,現在對於他來說,有時候他過一天可能跟我過一周的感覺差不多,每天都在忙,時間過的特別快,也沒有感覺做出來點什麼,當然實際肯定是怎麼做了一些東西的,是否我以後也會如此呢?說說技術把...