MySQL實現(xiàn)數(shù)據(jù)插入操作的示例詳解
使用MySQL插入數(shù)據(jù)時,可以根據(jù)需求場景選擇合適的插入語句,例如當數(shù)據(jù)重復時如何插入數(shù)據(jù),如何從另一個表導入數(shù)據(jù),如何批量插入數(shù)據(jù)等場景。本文通過給出每個使用場景下的實例來說明數(shù)據(jù)插入的實現(xiàn)過程和方法。
一、方法分類
二、具體方法
使用場景 | 作用 | 語句 | 注意 |
---|---|---|---|
常規(guī)插入 | 忽略字段名 | insert into 表名 values (值1, 值2,...,值n) | 默認value中的值依次填充所有字,如果出現(xiàn)唯一性沖突,就會拋出異常 |
按照字段插入 | insert into 表名(字段1, 字段2,...,字段n) values (值1, 值2,...,值n) | 字段和值一一對應 | |
一次性插入多條數(shù)據(jù) | insert into 表名(字段1, 字段2,...,字段n) values (值a1, 值a2,...,值an),(值b1, 值b2,...,值bn) | 多行之間用逗號隔開,不需要再次寫insert into語句 | |
從另一個表導入 | 導出A表的某些數(shù)據(jù)插入到B表 | insert into 表名B(字段B1, 字段B2,...,字段Bn) select 字段A1, 字段A2,...,字段An from 表名A where [執(zhí)行條件] | 字段A和B可以字段名稱不一樣,但是數(shù)據(jù)類型必須一致 |
插入時數(shù)據(jù)重復 | 如果記錄存在報錯 | insert into 表名(字段1, 字段2,...,字段n) values (值1, 值2,...,值n) | 如果插入的數(shù)據(jù)記錄存在,報錯并捕獲異常,不存在則直接新增記錄 |
如果記錄存在不插入記錄 | insert ignore into 表名(字段1, 字段2,...,字段n) values (值1, 值2,...,值n) | 如果插入的數(shù)據(jù)記錄存在就保存舊記錄忽略新記錄,不存在則直接新增記錄 | |
不論記錄是否存在都要插入記錄 | replace 表名(字段1, 字段2,...,字段n) values (值1, 值2,...,值n) | 如果插入的數(shù)據(jù)記錄存在就先刪除再更新,不存在則直接新增記錄 | |
如果記錄存在更新指定字段 | insert into … on duplicate key update | 如果插入的數(shù)據(jù)記錄存在就更新指定字段,不存在則直接新增記錄 |
三、實例
students 表 (id表示主鍵,name是姓名,score是平均成績)
id | name | score |
---|---|---|
1 | 李明 | 67 |
(1)常規(guī)插入
忽略字段名
執(zhí)行后結(jié)果
id | name | score |
---|---|---|
1 | 李明 | 67 |
2 | 張三 | 74 |
按照字段插入
insert into students(name) values('孫華');
執(zhí)行后結(jié)果
id | name | score |
---|---|---|
1 | 李明 | 67 |
2 | 張三 | 74 |
3 | 孫華 |
一次性插入多條數(shù)據(jù)
insert into students(name, score) values('劉平', '56'),('周雨', '90');
執(zhí)行后結(jié)果
id | name | score |
---|---|---|
1 | 李明 | 67 |
2 | 張三 | 74 |
3 | 孫華 | |
4 | 劉平 | 56 |
5 | 周雨 | 90 |
(2)從另一個表導入
students 表 (id表示主鍵,name是姓名,score是平均成績)
id | user_name | mobile_phone_number |
---|---|---|
1 | 馬化騰 | 13800000000 |
2 | 任正非 | 13800000011 |
3 | 馬云 | 13800000022 |
導出users表的某些數(shù)據(jù)插入到students表
insert into students(name,score) select user_name, mobile_phone_number from users where id <> 3;
執(zhí)行結(jié)果
id | name | score |
---|---|---|
1 | 李明 | 67 |
2 | 張三 | 74 |
3 | 孫華 | |
4 | 劉平 | 56 |
5 | 周雨 | 90 |
6 | 馬化騰 | 13800000000 |
7 | 馬云 | 13800000022 |
注意:只要對應字段的類型一樣,字段不一樣也可以導入數(shù)據(jù),不會沖突。
(3)插入時數(shù)據(jù)重復
如果記錄存在報錯
insert into students values(1, '張三', '74');
執(zhí)行結(jié)果: 報錯
Duplicate entry '1' for key 'PRIMARY'
如果記錄存在不插入記錄
insert ignore into students(id,name,score) values(1, '張三', '74');
執(zhí)行結(jié)果:不插入不報錯
Affected rows:0
id | name | score |
---|---|---|
1 | 李明 | 67 |
2 | 張三 | 74 |
3 | 孫華 | |
4 | 劉平 | 56 |
5 | 周雨 | 90 |
6 | 馬化騰 | 13800000000 |
7 | 馬云 | 13800000022 |
不論記錄是否存在都要插入記錄
replace students values(1, '張三', '74');
執(zhí)行結(jié)果
id | name | score |
---|---|---|
1 | 張三 | 74 |
2 | 張三 | 74 |
3 | 孫華 | |
4 | 劉平 | 56 |
5 | 周雨 | 90 |
6 | 馬化騰 | 13800000000 |
7 | 馬云 | 13800000022 |
如果記錄存在更新指定字段
insert into students(id) values(1) on duplicate key update name = '李明', score = '67';
執(zhí)行結(jié)果
id | name | score |
---|---|---|
1 | 李明 | 67 |
2 | 張三 | 74 |
3 | 孫華 | |
4 | 劉平 | 56 |
5 | 周雨 | 90 |
6 | 馬化騰 | 13800000000 |
7 | 馬云 | 13800000022 |
創(chuàng)建 students 表的代碼
-- ---------------------------- -- Table structure for students -- ---------------------------- DROP TABLE IF EXISTS `students`; CREATE TABLE `students` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '學生id', `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名', `score` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '成績', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of students -- ---------------------------- INSERT INTO `students` VALUES (1, '李明', '67');
創(chuàng)建 users 表的代碼
-- ---------------------------- -- Table structure for students -- ---------------------------- DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶id', `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用戶名', `mobile_phone_number` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手機號碼', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of students -- ---------------------------- INSERT INTO `users` VALUES (1, '馬化騰', '13800000000'); INSERT INTO `users` VALUES (2, '任正非', '13800000011'); INSERT INTO `users` VALUES (3, '馬云', '13800000022');
四、注意事項
(1)不寫字段名,需要填充自增ID
[使用]:0或者null或者default,自增id默認從1開始。
[使用]:或者沒有在自增id中出現(xiàn)的(不重復)數(shù)(例如-1,-2),浮點型數(shù)據(jù)例如3.4,最后顯示3,會進行四舍五入。即使定義了int類型,輸入‘3’或者浮點型,都會強制轉(zhuǎn)化為int類型,但是輸入'a'會報錯。具體細節(jié)可以看源碼。
問題:第一個字段id為什么可以寫null?如果建表的時候?qū)懥薸d為自增id,而寫0或者null或者default或者沒有在自增id中出現(xiàn)的(不重復)數(shù)(例如-1,-2),系統(tǒng)都會自動填充id。如果建表的時候沒有寫明是自增id,那么主鍵一定是不能為空的,這個時候?qū)憂ull就會報錯。
(2)按字段名填充,可以不錄入id
[注意]:字段要與值一一對應。
其余注意事項
- 字段名可以省略,默認所有列;
- 錄入值的類型和字段的類型要一致或兼容;
- 字段和值的個數(shù)必須一致。不能出現(xiàn)一行記錄5個值,另外一行6個值的情況;
- 如果寫了字段,即使是空值也不能空著,用null代替;
到此這篇關(guān)于MySQL實現(xiàn)數(shù)據(jù)插入操作的示例詳解的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)插入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql通過Adjacency List(鄰接表)存儲樹形結(jié)構(gòu)
本片介紹MYSQL存儲樹形結(jié)構(gòu)的一種方法,通過Adjacency List來實現(xiàn),一起來學習下。2017-12-12MySQL實現(xiàn)模糊查詢的高效方法總結(jié)(附30條優(yōu)化建議)
數(shù)據(jù)庫SQL優(yōu)化是老生常談的問題,在面對模糊查詢的時候又有什么好的優(yōu)化建議呢?這篇文章主要給大家介紹了關(guān)于MySQL實現(xiàn)模糊查詢的高效方法,文中還附30條優(yōu)化建議,需要的朋友可以參考下2024-03-03ubuntu linux下使用Qt連接MySQL數(shù)據(jù)庫的方法
Linux下完整的MySQL開發(fā)需要安裝服務器端,如果安裝客戶端也沒什么不好。直接在軟件中心搜mysql,把client和server選上。2011-08-08MySQL5.6 數(shù)據(jù)庫主從同步安裝與配置詳解(Master/Slave)
本篇文章主要介紹了MySQL5.6 數(shù)據(jù)庫主從同步安裝與配置詳解,具有一定的參考價值,有興趣的可以了解一下。2017-01-01Mysql賬號管理與引擎相關(guān)功能實現(xiàn)流程
Mysql中的每一種技術(shù)都使用不同的存儲機制、索引技巧、鎖定水平、并且最終提供廣泛的不同功能和能力。通過選擇不同的技術(shù),你能夠獲得額外的速度或者功能,從而改善應用的整體功能。這些不同的技術(shù)以及配套的相關(guān)功能在MySQL中被稱作存儲引擎2022-10-10