MySQL中replace into語(yǔ)句的用法詳解
在向表中插入數(shù)據(jù)的時(shí)候,經(jīng)常遇到這樣的情況:
1、首先判斷數(shù)據(jù)是否存在;
2、如果不存在,則插入;
3、如果存在,則更新。
在 SQL Server 中可以這樣寫(xiě):
if not exists (select 1 from table where id = 1) insert into table(id, update_time) values(1, getdate()) else update table set update_time = getdate() where id = 1
在MySQL 中也可以先select,判斷是否存在,存在則 update 否則 insert
但在MySQL 中有更簡(jiǎn)單的方法,使用 replace into關(guān)鍵字
或
replace into table(id, update_time) select 1, now();
replace into 跟 insert 功能類(lèi)似,不同點(diǎn)在于:replace into 首先嘗試插入數(shù)據(jù)到表中。
1、如果發(fā)現(xiàn)表中已經(jīng)有此行數(shù)據(jù)(根據(jù)主鍵或者唯一索引判斷)則先刪除此行數(shù)據(jù),然后插入新的數(shù)據(jù)。
2、 否則,直接插入新數(shù)據(jù)。
要注意的是:插入數(shù)據(jù)的表必須有主鍵或者是唯一索引!否則的話(huà),replace into 會(huì)直接插入數(shù)據(jù),這將導(dǎo)致表中出現(xiàn)重復(fù)的數(shù)據(jù)。
MySQL中replace into有三種寫(xiě)法:
1. replace into table(col, ...) values(...)
2. replace into table(col, ...) select ...
3. replace into table set col=value, ...
前兩種形式用的多些。其中 “into” 關(guān)鍵字可以省略,不過(guò)最好加上 “into”,這樣意思更加直觀。
另外,對(duì)于那些沒(méi)有給予值的列,MySQL 將自動(dòng)為這些列賦上默認(rèn)值。
可惜的是replace不支持update某些特性,也就不能直接當(dāng)作update使用:
常見(jiàn)update寫(xiě)法:update table set col=col+1 where id=1;
使用replace into不支持這樣的寫(xiě)法:replace into table set col=col+1,id=1;
1、首先判斷數(shù)據(jù)是否存在;(沒(méi)問(wèn)題)
2、如果不存在,則插入;(沒(méi)問(wèn)題)
3、如果存在,某字段值在原來(lái)的基礎(chǔ)上加上或減去某個(gè)數(shù),如加一操作。(不支持)
相關(guān)文章
mysql基礎(chǔ)架構(gòu)教程之查詢(xún)語(yǔ)句執(zhí)行的流程詳解
這篇文章主要給大家介紹了關(guān)于mysql基礎(chǔ)架構(gòu)教程之查詢(xún)語(yǔ)句執(zhí)行流程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-11-11
MySQL千萬(wàn)級(jí)數(shù)據(jù)從190秒優(yōu)化到1秒的全過(guò)程
優(yōu)化MySQL千萬(wàn)級(jí)數(shù)據(jù)策略還是比較多的,分表分庫(kù),創(chuàng)建中間表,匯總表以及修改為多個(gè)子查詢(xún),這里討論的情況是在MySQL一張表的數(shù)據(jù)達(dá)到千萬(wàn)級(jí)別,在這樣的情況下,開(kāi)發(fā)者可以嘗試通過(guò)優(yōu)化SQL來(lái)達(dá)到查詢(xún)的目的,所以本文給大家介紹了MySQL千萬(wàn)級(jí)數(shù)據(jù)從190秒優(yōu)化到1秒的全過(guò)程2024-04-04
windows7下啟動(dòng)mysql服務(wù)出現(xiàn)服務(wù)名無(wú)效的原因及解決方法
這篇文章主要介紹了windows7下啟動(dòng)mysql服務(wù)出現(xiàn)服務(wù)名無(wú)效的原因及解決方法,需要的朋友可以參考下2014-06-06
同時(shí)運(yùn)行多個(gè)MySQL服務(wù)器的方法
在同一臺(tái)機(jī)器上運(yùn)行多個(gè)有些情況下你可能想要在同一臺(tái)機(jī)器上運(yùn)行多個(gè)服務(wù)器。例如,你可能想要測(cè)試一個(gè)新的MySQL版本而讓你現(xiàn)有生產(chǎn)系統(tǒng)的設(shè)置不受到干擾, 或你可能是想要為不同的客戶(hù)提供獨(dú)立的MySQL安裝一個(gè)因特網(wǎng)服務(wù)供應(yīng)商。2008-05-05
SQLyog連接MySQL8.0+報(bào)錯(cuò):錯(cuò)誤號(hào)碼2058的解決方案
本文將總結(jié)如何解決 SQLyog 連接 MySQL8.0+ 時(shí)報(bào)錯(cuò):錯(cuò)誤號(hào)碼2058,文中通過(guò)圖文結(jié)合和代碼示例給大家總結(jié)了三種解決方案,具有一定的參考價(jià)值,需要的朋友可以參考下2023-12-12
MySQL中如何進(jìn)行SQL調(diào)優(yōu)舉例詳解
這篇文章主要介紹了SQL調(diào)優(yōu)的幾種方法,包括合理設(shè)計(jì)索引,避免SELECT*,避免在SQL中進(jìn)行函數(shù)計(jì)算等操作,避免使用%LIKE,注意聯(lián)合索引需滿(mǎn)足最左匹配原則,不要對(duì)無(wú)索引字段進(jìn)行排序操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
SQL字符型字段按數(shù)字型字段排序?qū)崿F(xiàn)方法
由于是按字母順序排列,所以123排在了2的前面,顯然不符合我們的要求,那么怎樣才能按照我們預(yù)想的數(shù)字順序排序呢2013-03-03
Linux服務(wù)上MySQL啟動(dòng)、重啟和關(guān)閉的操作方法
MySQL是一種廣泛使用的開(kāi)源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),常用于各種規(guī)模的應(yīng)用程序中,在Linux服務(wù)器上管理MySQL服務(wù)是一個(gè)基本的運(yùn)維任務(wù),本文將詳細(xì)介紹如何在Linux系統(tǒng)上啟動(dòng)、重啟和關(guān)閉MySQL服務(wù),涵蓋不同Linux發(fā)行版(如Ubuntu和CentOS)的操作方法2024-11-11

