日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 值到99999后不增值了_Mysql 增加新数据,若存在则更新的问题

發布時間:2025/3/15 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 值到99999后不增值了_Mysql 增加新数据,若存在则更新的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

P.S. 基于mysql 5.6,數據庫引擎是 InnoDB

解決方案:

1 、使用INSERT ... ON DUPLICATE KEY UPDATE Statement 語法;官網手冊地址

2、 使用REPLACE statement 官網手冊地址

3、邏輯層處理,先判斷是否存在記錄,有則修改數據然后提交(刪除然后插入),否則直接插入

方案一詳解

1、語法INSERT ... ON DUPLICATE KEY UPDATE ...

2、例子INSERT INTO t1 (a,b,c) VALUES (1,2,3)

ON DUPLICATE KEY UPDATE c=c+1;

3、說明如果數據庫表t1的字段a 為主鍵(Primary key)或者唯一索引(Unique Index),則上面的操作在遇到數據庫已經存在a=1的情況下,則會進行c自增1的效果,否則就是插入一條記錄。

如果是插入一條新記錄,則影響的行記錄數量是1;如果是更新,則返回的是2;沒有變化則返回0。

如果a的屬性是AUTO INCREMENT,則LAST_INSERT_ID()方法獲取到的是自增值(AUTO_INCREMENT VALUE),而不是影響的行數。

UPDATE 后面可更新多個字段,他們用英文逗號分割。

UPDATE 后面的賦值表達式,可以使用values(col_name)函數獲取到INSERT字段插入的值:INSERT INTO t1 (a,b,c) VALUES (1,6,3)

ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

如果,數據庫中已經存在a=1的記錄,那么c=1+6,用values(col_name)獲取col_name字段欲被分配的值,從而避免duplicate-key conflict。DELAYED選項在這個語句中無效。

方案二詳解

1、語法REPLACE [LOW_PRIORITY | DELAYED]

[INTO] tbl_name

[PARTITION (partition_name [, partition_name] ...)]

[(col_name [, col_name] ...)]

{VALUES | VALUE} (value_list) [, (value_list)] ...

REPLACE [LOW_PRIORITY | DELAYED]

[INTO] tbl_name

[PARTITION (partition_name [, partition_name] ...)]

SET assignment_list

REPLACE [LOW_PRIORITY | DELAYED]

[INTO] tbl_name

[PARTITION (partition_name [, partition_name] ...)]

[(col_name [, col_name] ...)]

SELECT ...

value:

{expr | DEFAULT}

value_list:

value [, value] ...

assignment:

col_name = value

assignment_list:

assignment [, assignment] ...

2、例子REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');

3、說明在沒有主鍵Primary key或者Unique index沖突時,和INSERT功能一樣;沖突時,它先刪除舊紀錄,然后插入新記錄來完成更新,這也意味著執行sql語句的用戶有插入和刪除的權限。

REPLACE時沒有指定的字段,其值會被設置為Default value,且沒有辦法獲取到舊紀錄該字段的值然后把他應用到新記錄中(即沒辦法像方案一中使用VALUES()函數)。

返回影響的行數值是刪除和增加的總和,如果返回1,說明只進行了增加。

由于REPLACE INTO的結果依賴SELECT的結果集記錄順序,而且這個順序無法保證,這有可能造成日志記錄數據不一致。因此,這個操作被標記為在聲明式備份時"不安全",且在聲明模式下,會在錯誤日志文件中記錄一個警告,然而在使用混合(MIXED)模式時,警告會基于行的格式被寫進一個二進制日志文件。

如果表是聯合主鍵,則更新時,這些主鍵都要相同才能認為是主鍵沖突,如果只有其中部分主鍵相同,則直接進行插入操作。

使用的算法是:嘗試直接將數據插入;

如果因為主鍵沖突造成插入失敗:刪除表中含有該主鍵的記錄;

插入新記錄;

方案三

有上述兩個方案,問題可以由代碼邏輯實現,但是,以上操作是保證了數據庫的原子操作,如果是自己實現,要保證這一條。

后記

產生這篇文章的起因是:有個新增用戶的業務需求,我想將新增和更新封裝為一個API,所以使用了ON DUPLICATE KEY UPDATE,開始是使用數據庫ID作為主鍵,但是,后來還需要保證用戶的手機號唯一,所以給手機字段添加了UNIQUE屬性,在新增用戶的時候,并不會觸發DuplicateKeyException,所以開始找ON DUPLICATE KEY UPDATE有沒有條件只需要確認primary key沖突即可,發現,只能換個思路實現:

1、查詢手機號是否存在;

2、存在則返回提示,否則,進行插入;

3、根據是否傳入數據庫ID作為更新還是新增的條件,進行新增更新操作。

總結

以上是生活随笔為你收集整理的mysql 值到99999后不增值了_Mysql 增加新数据,若存在则更新的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。