[数据库]---mysql 插入sql之 INSERT INTO和INSERT IGNORE INTO和REPLACE INTO和ON DUPLICATE KEY UPDATE比较应用
mysql插入一條數(shù)據(jù)方式有四種,接下來逐個說明驗證:
前提:
有一個表,作為本次測試:
CREATE TABLE `zs_test` (`id` int(11) NOT NULL AUTO_INCREMENT,`order_id` int(11) DEFAULT NULL,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `order_id_index` (`order_id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;表名是zs_test;
包括主鍵id,唯一索引order_id和普通列name;
INSERT INTO
最普通,最常用的插入是:
INSERT INTO zs_test (id,name,order_id) VALUES (1,‘a(chǎn)a’,11);
此時庫中有了一條數(shù)據(jù),id=1;name=‘a(chǎn)a’;order_id=11
| id | name | order_id |
| 1 | aa | 11 |
INSERT IGNORE INTO
- 1.用這個插入一條,主鍵和唯一索引都是新的:
INSERT IGNORE INTO zs_test (id,name,order_id) VALUES (2,‘bb’,12);
也成功,受影響的行數(shù)是1,此時庫中有兩條數(shù)據(jù),
| id | name | order_id |
| 1 | aa | 11 |
| 2 | bb | 12 |
當本次要插入的主鍵id和唯一索引order_id在庫中都沒有重復時,INSERT IGNORE INTO相當于INSERT INTO;
- 2.再插入一條,主鍵用了1,庫中已存在的:
INSERT IGNORE INTO zs_test (id,name,order_id) VALUES (1,‘bb’,13);
沒有報錯,受影響的行數(shù)是0,但是數(shù)據(jù)庫中的數(shù)據(jù)沒有變化,
| id | name | order_id |
| 1 | aa | 11 |
| 2 | bb | 12 |
- 3.再插入一條,唯一索引用了11,庫中已存在的:
INSERT IGNORE INTO zs_test (id,name,order_id) VALUES (3,‘bb’,11);
沒有報錯,受影響的行數(shù)是0,但是數(shù)據(jù)庫中的數(shù)據(jù)沒有變化,
| id | name | order_id |
| 1 | aa | 11 |
| 2 | bb | 12 |
當本次要插入的主鍵id或者唯一索引order_id在庫中有任何一個重復時,INSERT IGNORE INTO相當于不執(zhí)行任何操作;
REPLACE INTO
- 1.用這個插入一條,主鍵和唯一索引都是新的:
REPLACE INTO zs_test (id,name,order_id) VALUES (3,‘cc’,13);
也成功,受影響的行數(shù)是1,此時庫中有三條數(shù)據(jù),
| id | name | order_id |
| 1 | aa | 11 |
| 2 | bb | 12 |
| 3 | cc | 13 |
當本次要插入的主鍵id和唯一索引order_id在庫中都沒有重復時,REPLACE INTO相當于INSERT INTO;
- 2.再插入一條,主鍵用了1,庫中已存在的:
REPLACE INTO zs_test (id,name,order_id) VALUES (1,‘bb’,14);
執(zhí)行成功,受影響的行數(shù)是2,此時庫中有三條數(shù)據(jù),但是主鍵為1的那條數(shù)據(jù),他的order_id變成了14,name也變成bb
| id | name | order_id |
| 1 | bb | 14 |
| 2 | bb | 12 |
| 3 | cc | 13 |
當本次要插入的主鍵id和唯一索引order_id在庫中有任何一個重復時,REPLACE INTO相當于先刪除原數(shù)據(jù),再INSERT INTO本條數(shù)據(jù),所以受影響行數(shù)是2;
ON DUPLICATE KEY UPDATE
- 1.用這個插入一條,主鍵和唯一索引都是新的:
INSERT INTO zs_test (id,name,order_id) VALUES (5,‘a(chǎn)a’,15) ON DUPLICATE KEY UPDATE name=‘a(chǎn)abb’;
成功,受影響的行數(shù)是1,此時庫中有四條數(shù)據(jù),
| id | name | order_id |
| 1 | bb | 14 |
| 2 | bb | 12 |
| 3 | cc | 13 |
| 5 | aa | 15 |
當本次要插入的主鍵id和唯一索引order_id在庫中都沒有重復時,ON DUPLICATE KEY UPDATE后面的部分相當于沒寫,只是簡單的前面INSERT INTO的效果;
- 2.再插入一條,主鍵用了1,庫中已存在的,唯一索引隨意:
INSERT INTO zs_test (id,name,order_id) VALUES (1,‘a(chǎn)a’,12) ON DUPLICATE KEY UPDATE name=‘a(chǎn)abb’;
成功,受影響的行數(shù)是2,此時庫中有四條數(shù)據(jù),但主鍵為1的那條數(shù)據(jù)的name值變成了aabb
| id | name | order_id |
| 1 | aabb | 14 |
| 2 | bb | 12 |
| 3 | cc | 13 |
| 5 | aa | 15 |
當本次要插入的主鍵id庫中有重復時,ON DUPLICATE KEY UPDATE相當于不改變數(shù)據(jù),將后面update的值做修改;
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的[数据库]---mysql 插入sql之 INSERT INTO和INSERT IGNORE INTO和REPLACE INTO和ON DUPLICATE KEY UPDATE比较应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据库支持emoji表情的详解
- 下一篇: linux cmake编译源码,linu