比CRUD多一點兒(三):UPDATE、DELETE語句

圖片描述

這是MySQL系列筆記的第一部分,本系列筆記但願能按照筆者本身學習MySQL技術的經從來記錄,避免純粹按照內容一塊一塊總結,也就是不一樣於通常按內容分配章節的書籍的結構,會有一個平滑的閱讀曲線。內容比較豐富的技術點會按照專題在多個學習筆記中逐漸深刻。sql

這部分的標題叫比CRUD多一丁點兒,比起最基礎的w3c的SQL教程以外,只多一點的擴展,知足應付從純粹閱讀入門資料到能夠上手完成一個簡單的工做的需求。數據庫

第三篇的主要內容繼續是基礎SQL語句UPDATE和DELETE,這兩個相對比較簡單,在運維和處理線上數據問題時候可能比較經常使用,在開發過程當中基本上都只會使用最基礎的操做。併發

DELETE語句

最基礎的用法再也不贅述。說一下當使用DELETE刪除的數據須要用一個條件關聯來查找而不止是簡單的where條件時候,寫法是這樣的:運維

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

注意若是用了alias,刪除語句也必須用alias不能再用表名:單元測試

DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2
WHERE a1.id=a2.id;   -- 正確
DELETE t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2
WHERE a1.id=a2.id;   -- 錯誤

必定要提醒的是,DELETE和UPDATE必定記得加限定條件,不然很容易就可能釀成一樁慘案,由於數據庫須要保證MVCC(Multiversion concurrency control,是事務的基礎),這類更新操做的開銷很大甚至須要鎖表。筆者本身在線上數據庫作這些操做包括SELECT時候手已經都已經造成了下意識,必定會先寫下where條件,Ctrl-A再開始寫update,select。學習

TRUNCATE TABLE

相對剛纔說的DELETE操做很慢,若是寫單元測試和本身用的開發庫須要快速的清空一個表時候要怎麼作呢?答案是使用TRUNCATE測試

注意使用TRUNCATE時候若是表有設置自增列,好比自增的主鍵,是會被清空到初始值的,也就是TRUNCATE以後。而DELETE FROM t;這樣刪掉整張表的DELETE語句是不會清空自增值的。另外若是有外鍵關聯,那麼就須要使用set foreign_key_checks來去掉外鍵檢查:spa

set foreign_key_checks = 0;
truncate Account;
set foreign_key_checks = 1;

這個特性還引發一個筆者開發時候碰到的頗有意思的異常:就是當這樣清空了某張表t的主鍵後,與其有關聯關係的表a沒有清空,隨後在t中新插入數據,自增ID從新從1開始增長。結果a中的一些舊數據結果就跟t中的新數據關聯上了。哈哈哈,當時着實是以爲是否是鬧鬼了,查了挺久才發現。code

UPDATE語句

最基礎的用法再也不贅述。看下面例子:blog

UPDATE t1 SET yourname = realname + ".avi";

設置的值實際上是一個表達式,其實能夠這樣用別的列表,也能夠同時更新兩個表,也就是用上JOIN:

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

其實和在select中直接select兩個表不用寫join同樣,這其實也是join,只是是inner join的一種簡寫。那麼更新還能夠更新自身列:

UPDATE t1 SET counting = counting + 1 where id = 2;

列值這樣自增是實際開發中一個很經常使用的技巧,用在計數統計時候很是方便,並且也省得須要本身去面對先讀後寫在併發衝突時候引發的值覆蓋問題。而後還能夠加order bylimit來作只更新符合條件的前幾個:

UPDATE t SET counting = counting + 1 ORDER BY id DESC LIMIT 10;

一樣上面這個自增自身的例子,有些特殊的狀況頗有意思,即當要更新的主鍵自增id。那麼若是不加order by直接更新的話:

UPDATE t SET id = id + 1;   -- 這是錯誤的

會報id衝突的錯誤,沒法執行。增長了order by就能夠順利執行了:

UPDATE t SET id = id + 1 ORDER BY id DESC;

必定要提醒的是,DELETEUPDATE必定記得加限定條件,不然很容易就可能釀成一樁慘案,由於數據庫須要保證MVCC(Multiversion concurrency control,是事務的基礎),這類更新操做的開銷很大甚至須要鎖表。筆者本身在線上數據庫作這些操做包括SELECT時候手已經都已經造成了下意識,必定會先寫下where條件,Ctrl-A再開始寫update,select

相關文章
相關標籤/搜索