mySql update容易出錯的乙個地方

2021-08-02 22:48:50 字數 1619 閱讀 2389

# 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 的作用相似。但是這種萬能型別應該盡量少用,盡量使用具體的型別,或者使用乙個具體的介面型別。主要的原因是,讓編譯期的型別檢查擋住編碼錯誤,減少執行期的錯誤...