概述
多表關聯查詢的時候會用到臨時表插入數據,然後再用select查行查詢,在往臨時表里插入數據的時候,我們經常會用到判斷如果臨時表里有了這部分數據我們就要更新數據,如果臨時表里沒有這部分數據我們就要插入,這個時候可以怎麼去實現呢?
下面介紹mysql的replace into語法和mysql資料庫on duplicate key update實現方式。
一、mysql的replace into語法
1、語法
Mysql replace與replace into都是經常會用到的功能;replace其實是做了一次update操作,而不是先delete再insert;而replace into其實與insert into很像,但對於replace into,假如表中的一個舊記錄與一個用於PRIMARY KEY或一個UNIQUE索引的新記錄具有相同的值,則在新記錄被插入之前,舊記錄被刪除。
--前兩種形式用的多些,對於那些沒有給予值的列,MySQL將自動為這些列賦上默認值replace into table(col, ...) values(...)replace into table(col, ...) select ...replace into table set col=value, ...
2、實驗
1)環境準備
--建表create table t1(id bigint(10),name varchar(16),sale bigint(10),operatime datetime,UNIQUE KEY `idx_id` (`id`) USING BTREE);create table t2(id bigint(10),name varchar(16),sale bigint(20),UNIQUE KEY `idx_id` (`id`) USING BTREE);-- 插入數據INSERT into t1 values(1,"xiaohong",1000,now());INSERT into t1 values(2,"xiaoming",500,now());INSERT into t2 values(1,"xiaohong",300);INSERT into t2 values(2,"xiaoming",400);INSERT into t2 values(3,"xiaoxiao",900);
2)mysql replace into實現
replace into t1 select id,name,sale,now() from t2;
結果:實現了將表t2更新到表t1中去,存在就更新,不存在就插入。
二、mysql的on duplicate key update語法
mysql並沒有oracle、mssql的merge into語法,但是有個on duplicate key update語法(不是標準的sql語法)可以實現merge into語法。ON DUPLICATE KEY UPDATE為Mysql特有語法,使用時應多注意主鍵和插入值是否是我們想要插入或修改的key、Value。
創建表,注意要有一個唯一索引 new_code_index, 插入或者更新時,以此為標準。另外在高並發環境下,禁用insert into …on duplicate key update…,因為會造成mysql主從不一致。
1、相關語法
--單條記錄下使用--假如t1表的主鍵或者UNIQUE 索引是a,如果資料庫裡面已經存在a=1的記錄則更新這條記錄的c欄位的值為原來值+1,然後返回值為2。--如果不存在則插入a=1,b=2,c=3到資料庫,然後返回值為1。INSERT INTO t1(a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;--多記錄下使用INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(c);
2、實驗
1)環境準備
--建表create table t1(id bigint(10),name varchar(16),sale bigint(10),operatime datetime,UNIQUE KEY `idx_id` (`id`) USING BTREE);create table t2(id bigint(10),name varchar(16),sale bigint(20),UNIQUE KEY `idx_id` (`id`) USING BTREE);-- 插入數據INSERT into t1 values(1,"xiaohong",1000,now());INSERT into t1 values(2,"xiaoming",500,now());INSERT into t2 values(1,"xiaohong",300);INSERT into t2 values(2,"xiaoming",400);INSERT into t2 values(3,"xiaoxiao",900);
2)on duplicate key update實現
insert into t1 select id,name,sale,now() from t2 on duplicate key update sale=values(sale);
結果:實現了將表t2更新到表t1中去,存在就更新,不存在就插入,
注意:id欄位是主鍵或UNIQUE索引,不然只會插入t2表所有行數據
今天主要介紹mysql資料庫兩個另類實現merge into的方式,後面會再介紹其他資料庫的實現方式,感興趣的朋友可以關注下~