# update語句的正確語法示例
update
tb set
col1
=value1
,col2
=value2
,col3
=value3
where
col0
=value0
andcol5
=value5
; 上例是正確的做法,
不合理的update應該是什麼樣子的呢,是將set後接的並列字段分隔符改為」and」,
注意這樣寫的話,mysql並不會報錯,還會執行成功,但是語義完全和」逗號」作為分隔符是兩碼事
:原來在update … set後接分隔符為」and」的語句,由於and的優先順序較高,所以先處理「and」,再處理「=」,於是「=」後面的值只有邏輯運算的結果true(1) / false(0),
# 第乙個實驗解析update t set c1=11 and c2='aa' where id=1;
# 在這條語句中mysql將c1=11 and c2='aa'解析成了c1=(11 and c2='aa'),而在這張表中(11 and c2='aa')是乙個假語句(false),所以mysql將c1值解析為c1=0
mysql> select 11 and c2='aa' from t where id=1;
+----------------+
| 11 and c2='aa' |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)
# 所以最終出現了c1變為0,c2沒有任何改變的現象
# 第二個實驗解析
update t set c2='aa' and c1= 11 where id=1;
# 在這條語句中mysql將c2='aa' and c1= 11解析成了c2=('aa' and c1= 11),而在這張表中('aa' and c1= 11)是乙個假語句(false),所以mysql將c2值解析為c2=0,然後隱式轉換,將'0'儲存到c2列
mysql> select 'aa' and c1= 11 from t where id=1;
+-----------------+
| 'aa' and c1= 11 |
+-----------------+
| 0 |
+-----------------+
1 row in set, 1 warning (0.01 sec)
# 所以最終出現了c2變為'0',c1依舊沒變
問題總結
這個問題告訴我們,sql語句一定要寫規範了,執行sql語句前一定要清楚這條sql的執行邏輯,對於update/delete手動執行之前,一定要按照如下順序來==
begin;update /
delete ...;
select 校驗資料;
commit;
--資料校驗成功
rollback;
--資料校驗失敗
容易出錯的 if 語句
下面列舉幾個容易出錯的if語句例項,如果後續還有新的發現,還會繼續更新!int n 5 if n 0 printf 值為正 初次執行,感覺一切正常,沒有錯誤,這時我把n的值改為 5重新編譯後,結果還是為正。這是為什麼?仔細一瞧,我們發現在 n 0 後面我們多加了個分號!原因 只有乙個分號的語句叫做空...
C 容易出錯的點
1 c風格字串的兩種形式 1 char a 手動新增結束符 0 2 char a abv 預設新增 0 2 sizeof 返回的值表示的含義如下 單位位元組 陣列 編譯時分配的陣列空間大小 指標 儲存該指標所用的空間大小 儲存該指標的位址的長度,是長整型,應該為4 型別 該型別所佔的空間大小 物件 ...
引數太靈活容易出錯
引數太靈活容易出錯 金慶的專欄 2020.7 golang中可以將引數型別設為 inte ce 這樣就可以傳入任意型別的引數,和 c 中 void 的作用相似。但是這種萬能型別應該盡量少用,盡量使用具體的型別,或者使用乙個具體的介面型別。主要的原因是,讓編譯期的型別檢查擋住編碼錯誤,減少執行期的錯誤...