天天看點

深入update語句(延伸學習)

常常使用的到了更新操作。學習後,知道了update還有其他一些用法,以前并不知道。現在進行總結

一、update後面使用order by的情況

什麼時候有必要增加order by:假如一個表中有自增型或者唯一鍵id。當想實作對所有id都加一。就會用到類似如下的sql:

update teams set teamno=teamno+1

此時就會出現問題,假如有兩行資料,一行的teamno=6,另一行的teamno=7。當執行teamno=teamno+1語句,6的值加上1變成7,但是還存在teamno=7的一行,那麼就會出現重複而報錯。解決辦法是,

先讓teamno=7的行執行更新,然後才讓teamno=6的行執行更新。這樣就不會出現重複沖突情況。使用 order by可以指定更新的順序。

sql語句修改為:update teams set teamno=teamno+1 order by teamno desc

成功運作。

總結:因為主鍵,unique都會要求值是唯一的。更新會出現值重複錯誤。是以隻有針對字段值限制是唯一的時候,使用update才有必要添加order by

二、update交換列值的測試:

sql語句  update teams set playerno=division,division=playerno where teamno=129

結果:兩個字段的值變為一樣了。

結論:按照順序去執行,先執行了playerno=division。後面執行division=playerno的時候,因為前面playerno導緻的值已經改變了,因而不是過去的值,将最新的playerno的值賦給了division。結果,我們

看到兩個字段的值變成一樣了。

三、update 更新多表的實踐:

update players as p,teams as t set p.name='測試update更新多表',t.playerno='測試多表更新'  where p.name='個人各個' and t.playerno='jgjgg'

執行上面語句結果:由于 t.playerno='jgjgg'找不到對于的行,因而這個update語句沒有執行set子句的操作。

是通過where條件來保證,兩次update操作視為一個事務保持完整性。

完全可以分成兩次update,如果分解成兩個步驟就是:

update players as p set p.name='測試update更新多表'  where p.name='個人各個'

update teams as t set t.playerno='測試多表更新' where t.playerno='jgjgg'

也是可以完成上面的操作。

使用多表更新的方式有什麼好處?

在多表更新文法中,多次update操作視為一個事務保持完整性,隻要其中一個更新失敗。那麼其他的更新是不會執行的。比如上面的測試結果就說明這點了。

歸納為:sql語句更簡潔。操作更加安全。

不正确之處,歡迎指正!