国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

Mysql 原生_語(yǔ)句中save or update 的寫法匯總

2019-11-02 14:37:21
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

   背景

    在平常的開發(fā)中,經(jīng)常碰到這種更新數(shù)據(jù)的場(chǎng)景:先判斷某一數(shù)據(jù)在庫(kù)表中是否存在,存在則update,不存在則insert。

  如果使用Hibernate,它自帶saverOrUpdate方法,用起來(lái)很方便,但如使用原生sql語(yǔ)句呢?

    新手最常見(jiàn)的寫法是,先通過(guò)select語(yǔ)句查詢記錄是否存在,存在則使用update語(yǔ)句更新,不存在則使用insert語(yǔ)句插入。

  但是這樣做明顯不夠優(yōu)雅,存在幾個(gè)問(wèn)題:

  •為了執(zhí)行一次更新操作,卻在程序中使用了兩次sql查詢語(yǔ)句,在系統(tǒng)負(fù)載比較大的情況下,性能還是會(huì)有影響的。

  •代碼中存在if else語(yǔ)句,明明干了一件事,代碼卻很長(zhǎng)。碼農(nóng)都是懶人,能把事情簡(jiǎn)單做的為啥要復(fù)雜做呢:)。

  那么問(wèn)題來(lái)了,如何優(yōu)雅的用sql語(yǔ)句實(shí)現(xiàn)saverOrUpdate?

    最近工作上也碰到類似

兔六電影網(wǎng)[www.aikan.tv/special/tuliudianyingwang/]
更新數(shù)據(jù)的問(wèn)題,寫多了也開始覺(jué)得煩。記得Oracle下有Merge的寫法,就google一下mysql的類似實(shí)現(xiàn),整理如下:

  數(shù)據(jù)不存在則插入,存在則無(wú)操作

     在insert語(yǔ)句中使用ignore關(guān)鍵字實(shí)現(xiàn)數(shù)據(jù)不存在則插入,存在則無(wú)操作。它的實(shí)現(xiàn)邏輯是,當(dāng)插入語(yǔ)句出現(xiàn)主鍵沖突,或者唯一鍵沖突時(shí),不拋出錯(cuò)誤,直接忽略這條插入語(yǔ)句。官網(wǎng)上的相關(guān)介紹如下:

  “

  If you use the IGNORE keyword, errors that occur while executing the INSERT statement are ignored. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row is discarded and no error occurs. Ignored errors may generate warnings instead, although duplicate-key errors do not.

  ”

  Mysql官方文檔中提供標(biāo)準(zhǔn)的語(yǔ)法:

  代碼如下:

  INSERT IGNORE

  INTO tbl_name

  [PARTITION (partition_name,...)]

  [(col_name,...)]

  {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

  或者

  代碼如下:

  INSERT IGNORE

  [INTO] tbl_name

  [PARTITION (partition_name,...)]

  [(col_name,...)]

  SELECT ...

  可見(jiàn)除了多了個(gè)IGNORE關(guān)鍵字以外,跟一般INSERT語(yǔ)句并無(wú)區(qū)別。

  舉個(gè)栗子:

  1.建一張測(cè)試用的表

  代碼如下:

  CREATE TABLE `test_tab` (

  `name` varchar(64) NOT NULL,

  `age` int(11) NOT NULL,

  PRIMARY KEY (`name`)

  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  2.插入一條數(shù)據(jù)

  代碼如下:

  insert into `test_tab` (`name`,`age`) values ('zhangsan',24)

  當(dāng)前test_tab表的數(shù)據(jù)為:

  代碼如下:

  name|age

  :—-|:—

  zhangsan|24

  3.再執(zhí)行一次步驟2的插入語(yǔ)句,則會(huì)報(bào)異常:

  代碼如下:

  [Err] 1062 - Duplicate entry 'zhangsan' for key 'PRIMARY'

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 噶尔县| 建水县| 凤冈县| 固阳县| 威海市| 阳曲县| 崇州市| 同江市| 泽库县| 徐州市| 化隆| 米泉市| 蕲春县| 泰宁县| 富锦市| 亚东县| 大港区| 三台县| 弥勒县| 山阴县| 龙州县| 晋城| 团风县| 北碚区| 静海县| 长阳| 遂川县| 武冈市| 西平县| 个旧市| 台南县| 大城县| 合水县| 云南省| 阳信县| 上蔡县| 汶川县| 甘谷县| 西青区| 敦煌市| 叙永县|