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

首頁 > 數(shù)據(jù)庫 > 文庫 > 正文

sql插入數(shù)據(jù)提示已經(jīng)存在,則執(zhí)行update更新

2024-09-07 22:12:54
字體:
供稿:網(wǎng)友
  這個(gè)例子其實(shí)是非常的簡單了就是要實(shí)現(xiàn)sql插入數(shù)據(jù)時(shí),如果已經(jīng)存在,則執(zhí)行update更新了,這樣對(duì)于sql與程序來講是非常的簡潔的,下面就和小編一起來深入的分析一下吧.
 
  在很多項(xiàng)目中,我們需要對(duì)數(shù)據(jù)進(jìn)行不斷的調(diào)用和更新,如果有新的數(shù)據(jù)過來,還要把它加入到數(shù)據(jù)庫中。其中非常重要的一種情況就是,我們不知道傳過來的數(shù)據(jù)是不是原本數(shù)據(jù)庫中就已經(jīng)有了的記錄,所以我們常常需要先通過抓取數(shù)據(jù),判斷是否存在,如果存在執(zhí)行update,如果不存在執(zhí)行insert,這樣就要進(jìn)行兩次數(shù)據(jù)庫操作,第一次是查詢,第二次是更新或插入,有沒有一種方法可以只需要執(zhí)行一次操作即可呢?答案是有的。
 
  INSERT ... ON DUPLICATE KEY UPDATE 方法可以幫助我們非常好的解決這一問題。讓我們來看一個(gè)例子:
 
  INSERT INTO table (a,b,c) VALUES (1,2,3)  ON DUPLICATE KEY UPDATE b=b-1,c=c+1;
 
  這一個(gè)語句就可以實(shí)現(xiàn),在插入(1,2,3)這條記錄的時(shí)候,檢查是否存在a=1,如果有a=1的記錄,那么更新a=1這條記錄,相當(dāng)于執(zhí)行了一次下面這個(gè)語句:
 
  UPDATE table SET b=b-1,c=c+1 WHERE a=1;
 
  如果數(shù)據(jù)庫中不存在a=1這條記錄,那么就插入新的記錄.
 
  使用INSERT ... ON DUPLICATE KEY UPDATE的前提是,a字段被設(shè)置為“唯一鍵”索引,否則該方法是無效的.

  如果一個(gè)表中包含了一個(gè)auto_increment的字段,每次insert數(shù)據(jù)后,可以通過last_insert_id()方法返回最后自動(dòng)生成的值,如果通過INSERT ... ON DUPLICATE KEY UPDATE語句修改了一條數(shù)據(jù),那么再通過last_insert_id()方法獲取的值將不正確,實(shí)際測試中是多了一個(gè)數(shù),比如向表中增加了3條數(shù)據(jù),那么通過last_insert_id()方法得到的值是3,但是通過該語句修改了一條數(shù)據(jù)后,通過last_insert_id()方法得到的值是4。如果想解決該問題,可以通過如下語句:
 
  INSERT INTO table (a,b,c) VALUES (1,2,3)  
 
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;  
 
  重點(diǎn)是這句id=LAST_INSERT_ID(id),還有一種方法是使用ignore,我們來看一個(gè)例子:
 
  INSERT ignore INTO a(id, type)  VALUES  ( 11, 22)
 
  這個(gè)語句中使用了ignore,意思是:如果數(shù)據(jù)庫中存在一條記錄id=11,那么就不執(zhí)行insert操作(忽略),只有上述條件不滿足時(shí)才執(zhí)行插入操作,ignore方法也要求這里的id為唯一鍵(主鍵默認(rèn)就是是唯一鍵,因此id可以是主鍵).
 
  另外,還有一種方法是replace into,它的使用方法和insert into一樣,但是和上面的ignore效果不同,如果數(shù)據(jù)庫中已經(jīng)存在id=11,那么強(qiáng)制替換id=11這條記錄的type為22.
 
  看個(gè)例子:下面通過代碼說明之間的區(qū)別,如下:
 
  create table testtb(
  id int not null primary key,
  name varchar(50),
  age int
  );
  insert into testtb(id,name,age)values(1,"bb",13);
  select * from testtb;
  insert ignore into testtb(id,name,age)values(1,"aa",13);
  select * from testtb;//仍是1,“bb”,13,因?yàn)閕d是主鍵,出現(xiàn)主鍵重復(fù)但使用了ignore則錯(cuò)誤被忽略
  replace into testtb(id,name,age)values(1,"aa",12);
  select * from testtb; //數(shù)據(jù)變?yōu)?,"aa",12
  總結(jié)一下:如果要實(shí)現(xiàn)插入數(shù)據(jù)時(shí)檢查是否已經(jīng)存在某個(gè)唯一鍵的數(shù)據(jù),如果存在,則替換該記錄的其他字段,我們可以使用三種方法來實(shí)現(xiàn)插入數(shù)據(jù)時(shí)判斷是否存在對(duì)應(yīng)鍵的記錄,分別是INSERT ... ON DUPLICATE KEY UPDATE、insert gnore into和replace into,其中INSERT ... ON DUPLICATE KEY UPDATE和replace into可以實(shí)現(xiàn)如果已經(jīng)存在對(duì)應(yīng)鍵的記錄時(shí),替換該記錄的其他字段.
 
 

(編輯:武林網(wǎng))

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 简阳市| 临高县| 克什克腾旗| 雷波县| 江城| 和龙市| 米泉市| 湘阴县| 宣恩县| 宜城市| 阜城县| 城固县| 朝阳县| 称多县| 利津县| 晋宁县| 延边| 大宁县| 怀远县| 沅陵县| 乌兰浩特市| 常德市| 宜黄县| 林西县| 万全县| 汉阴县| 郸城县| 雷州市| 微博| 民权县| 时尚| 阿拉善盟| 襄城县| 贵德县| 黎平县| 舟山市| 江北区| 秭归县| 揭阳市| 定兴县| 永康市|