深入探討MySQL中 UPDATE 的使用細節
在MySQL中,可以使用 UPDATE 語句來修改、更新一個或多個表格的資料。以下這篇文章帶大家探究下MySQL中 UPDATE 的使用細節,希望對大家有幫助。
需求背景
最近接到一個資料遷移的需求,舊系統的資料遷移到新系統;舊系統不會再新增業務數據,業務操作都會在新系統上進行
為了降低遷移的影響,數據進行分批遷移,也就是說新舊系統會並行一段時間
數據分批不是根據id 範圍來分的,也就說每批資料的id 都是無規律的
另外,為了保證新舊系統資料的對應,新系統的id 盡可能的沿用舊系統的id
因為表id 在新舊系統都是自增的,所以遷移的時候,舊系統的id 可能在新系統已經被佔用了,類似如下
需求描述
資料遷移的時候,盡可能沿用舊系統的id,而衝突的id 需要進行批量調整
如何調整這批衝突的id,正是我當下要實現的需求
我的實現是根據業務數據的增長情況,結合目前新系統的最大id 來預設一個起始的id
這個 SQL 該如何寫?
需求實作
有小夥伴可能覺得,這還不簡單?
不就5 條數據嘛,這麼寫不就搞定了
# 多簡單的事,還鋪墊那麼多,樓主你到底會不會?
樓主此刻幡然醒悟:小夥伴,你好厲害哇哦
但是如果衝突的數據很多了(幾百上千),你也這樣一條一條改?
如果你真這樣做,我是真心佩服你
很顯然,理智的小伙伴更多
# 那該如何實現了?
樓主就不賣關子了,可以用局部變數 UPDATE 來實現,直接上 SQL
我們來看實際案例
表tbl_batch_update
資料如下
##[
樓主平常使用 UPDATE 的時候,基本上沒有結合 ORDER BY ,也沒嘗試過結合 LIMIT
這次嘗試讓樓主對 UPDATE 產生了陌生的感覺,它的完整語法應該是怎樣的?我們慢慢往下看
UPDATE
下文都是基於 MySQL 8.0 的官方文件UPDATE Statement 整理而來,推薦大家直接去看官方文件
單表文法
# # 是不是有很多疑問:
多表語法
# 相較於單一表,似乎更簡單一些,不支援 ORDER BY# 和 LIMIT
# LOW_PRIORITY
## UPDATE 的修飾符之一,用來降低 SQL 的優先權
當使用 LOW_PRIORITY 之後, UPDATE# 的執行將會延遲,直到沒有其他客戶端從表中讀取資料為止
但是,只有表級鎖定的儲存引擎才支援 LOW_PRIORITY ,表級鎖定的儲存引擎包括: MyISAM 、 MEMORY 和 MERGE ,因此最常用的#InnoDB 是不支持的
使用場景很少,混個眼熟就好IGNORE
##
# UPDATE的修飾符之一,用來宣告 SQL 執行時發生錯誤的處理方式 如果沒有使用 IGNORE
, UPDATE
執行時如果發生錯誤會中止,如下所示 9002 更新成 9003 的時候,主鍵衝突,整個 UPDATE 中止, #9000# 更新成的 9001 會回滾, 9003
~9005
尚未執行更新 如果使用
,會是什麼狀況了?
######UPDATE###### 執行期間即使發生錯誤了,也會執行完成,最後傳回受影響的行數###上述回傳受影響的行是 2 ,你們說說是哪兩行修改了?
更多關於 IGNORE# 的信息,請查看:The Effect of IGNORE on Statement Execution
# 關於使用場景,在新舊系統並行,做資料遷移的時候可能會用到,主鍵或是唯一鍵衝突的時候直接忽略
ORDER BY
如果大家對 UDPATE 的執行流程了解的話,那就更了解
UPDATE 其實有兩個階段: 查階段 、 #更新階段
一行一行的處理,查到一行滿足 WHERE 子句,就更新一行
所以,這裡的 ORDER BY 就和 SELECT 中的 ORDER BY 是一樣的效果
關於使用場景,大家可以回過頭去看看前面講到的的需求背景,
IGNORE 的案例1 中的報錯,其實也可以用 ORDER BY#
LIMIT
# LIMIT row_count 子句是行符合限制。一旦找到滿足 WHERE 子句的 row_count 行,無論這些行是否實際更改,該語句都會立即停止
# 也是就說 LIMIT 限制的是 查階段# ,與 #更新階段 沒有關係
##注意:與 SELECT 語法中的 LIMIT
# 還是有區別的
value DEFAULT
UPDATE 中 UPDATE 中
##n SET
子句的 value
我們看下 SQL_MODE ,執行 SELECT @@sql_mode; 得到結果
#; 得到結果# STRICT_TRANS_TABLES 顯示啟動了嚴格模式,對 INSERT 和
UPDATE
## 語句的問題」###C #value 管控會更嚴格 如果我們關閉嚴格模式,再看看執行結果 name 欄位宣告變成 NOT NULL ,非嚴格 SQL 模式下,將 name 設為 #NULL 是成功的,但更改的值並非 NULL
,而是 VARCHAR
# 類型的預設值: 空白字串('') #小結下 1、嚴格SQL 模式下,對
NOT NULL 的欄位設定 #NULL ,會直接報錯,更新失敗 2、非嚴格SQL 模式下,對
NOT
NULL# 的欄位設定
NULL ,會將欄位值設定欄位類型對應的預設值 關於欄位類型的預設值,可查看:Data Type Default Values 關於
sql_mode,可檢視:Server SQL Modes# # 通常情況下,生成環境的
MySQL通常都是嚴格模式,所以大家知道有 value DEFAULT
這回事就夠了
SET 字段順序
針對如下 SQL
# 然而,以下 SQL 中的 name 列的值會是多少
我們來看下結果
name 的值是不是跟預想的有點不一樣? 單表
UPDATE###### 的 ######SET###### 是從左到右進行的,然而多表 ##### ##UPDATE###### 卻不是,多表 ######UPDATE###### 不能保證以任何特定順序進行#########總結####### ### 1、不管是 ######UPDATE###### ,或是 ######DELETE###### ,都有先查的過程,查到一行處理一行# ##2、 UPDATE 語法中的 LOW_PRIORITY 很少用, #IGNORE 偶爾用, #ORDERIGNORE 偶爾用, #ORDER
BY和 LIMIT
相對會使用的多一點,都混合眼熟3、
sql_mode是比較重要的知識點,推薦大家掌握;生產環境,強烈建議開啟嚴格模式
原文網址:https://www.cnblogs.com/youzhibing/p/16719474.html作者:青石路
######【相關推薦:###mysql影片教學###】###以上是深入探討MySQL中 UPDATE 的使用細節的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。

可以通過以下步驟打開 phpMyAdmin:1. 登錄網站控制面板;2. 找到並點擊 phpMyAdmin 圖標;3. 輸入 MySQL 憑據;4. 點擊 "登錄"。

使用 Navicat Premium 創建數據庫:連接到數據庫服務器並輸入連接參數。右鍵單擊服務器並選擇“創建數據庫”。輸入新數據庫的名稱和指定字符集和排序規則。連接到新數據庫並在“對象瀏覽器”中創建表。右鍵單擊表並選擇“插入數據”來插入數據。

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

可在 Navicat 中通過以下步驟新建 MySQL 連接:打開應用程序並選擇“新建連接”(Ctrl N)。選擇“MySQL”作為連接類型。輸入主機名/IP 地址、端口、用戶名和密碼。 (可選)配置高級選項。保存連接並輸入連接名稱。

在 Navicat 中執行 SQL 的步驟:連接到數據庫。創建 SQL 編輯器窗口。編寫 SQL 查詢或腳本。單擊“運行”按鈕執行查詢或腳本。查看結果(如果執行查詢的話)。

Navicat 連接數據庫時常見的錯誤及解決方案:用戶名或密碼錯誤(Error 1045)防火牆阻止連接(Error 2003)連接超時(Error 10060)無法使用套接字連接(Error 1042)SSL 連接錯誤(Error 10055)連接嘗試過多導致主機被阻止(Error 1129)數據庫不存在(Error 1049)沒有權限連接到數據庫(Error 1000)
