在往表里面插入數據的時候,經常需要:a.先判斷數據是否存在於庫里面;b.不存在則插入;c.存在則更新
一、replace into
前提:數據庫里面必須有主鍵或唯一索引,不然replace into 會直接插入新數據,導致數據表里面有重復數據
執行時先嘗試插入數據:
a.當數據表里面存在(通過主鍵或唯一索引來判斷)該數據,則先將表里的數據刪除,再插入新的數據
b.如果數據表里面不存在該數據,則直接插入數據
replace into是insert into的增強版,語法跟insert iton差不多
replace into table_name(columns)values(values1,values2);
replace into table_name(columns) select columns from table_name2
測試數據(該表建立了一個復合的唯一索引user_add):
CREATE TABLE `relace_on` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`interal` tinyint(3) unsigned NOT NULL,
`add_time` date NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_add` (`user_id`,`add_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
插入測試數據:
INSERT INTO relace_on (user_id, interal, add_time)
VALUES
(1,20,'2016-05-06'),
(2,20,'2016-05-06'),
(3,20,'2016-05-06'),
(1,20,'2016-05-07'),
(2,20,'2016-05-07'),
(3,20,'2016-05-07')
現在數據庫數據:
接下來執行一下replace into語句(存在):replace INTO relace_on(user_id, interal, add_time)values(1,40,'2016-05-06'),(2,60,'2016-05-06'),(3,80,'2016-05-06')
此時sql執行成功,受影響行數為6行(刪除三條,插入三條)
對比一下你會發現user_id(1,2,3)的賬戶在2016-05-06這一天原先都是有數據的,並且id為(1,2,3);現在執行了replace into后,id變成了(7,8,9),並且interal字段的值為執行語句的值,此時replace into語句根據數據表中的user_add這個復合的唯一索引發現在數據表中user_id為(1,2,3)的用戶在2016-05-06這天各存在一條記錄,這時就把原先的三條數據刪除了,重新插入了三條,所以id從1,2,3變成了7,8,9;並且interal的值也變了
接下來執行一下replace into語句(不存在):replace INTO relace_on(user_id, interal, add_time)values(4,40,'2016-05-06'),(5,60,'2016-05-06'),(6,80,'2016-05-06')
此時sql執行成功,受影響行數為3行(插入三條)
對比上圖,你會發現原先的數據沒變,只是新增了三條數據,同樣是2016-05-06這天的,但是user_id是(4,5,6)根據user_add這個復合的唯一索引,這三條數據不存在數據表中,所以直接插入即可
二、on duplicate key update
它也是可以用於更新數據的,跟replace into有點相似,但是on duplicate key update是數據表里面存在該數據就更新,不存在則插入,;而replace into則是存在就刪除,再插入,不存在則插入
依舊使用上面現有的數據來測試:
先添加一個字段,用於等下更新多個字段之用:ALTER TABLE `relace_on` ADD COLUMN `copy_interal` tinyint(3) UNSIGNED NOT NULL AFTER `interal`;
語法:
更新單個字段:insert into table_name(columns)values(values1,values2) on duplicate key update column=values(column)或者column=value(1,'zgw')
更新多個字段:insert into table_name(columns)values(values1,values2) on duplicate key update column1=values(column1),column2=values(column2)
執行一條語句(存在):insert into relace_on(user_id, interal,copy_interal, add_time)values(6,100,200,'2016-05-06') on duplicate KEY update interal=values(interal),copy_interal=values(copy_interal)
如圖,user_id=6,add_time='2016-05-06'這條數據存在,則更新interal和copy_interal兩個字段的值(interal原先為80,copy_interal新增字段默認為0)
再次執行一條語句(不存在):insert into relace_on(user_id, interal,copy_interal, add_time)values(7,100,200,'2016-05-06') on duplicate KEY update interal=values(interal),copy_interal=values(copy_interal)