最近遇到了把我坑慘的一個update語句:
update apps set owner = '10011' and owner_name = 'xiaoming' where owner_code = '10010' and owner_name = 'lihua';
在MySQL里面update一條記錄瘦棋,語法都正確的异旧,但記錄并沒有被更新...
剛遇到這個問題的時候,我拿到這條語句直接在測試庫里面執(zhí)行了好幾次,發(fā)現(xiàn)確實有問題。
測試SQL:update apps set owner = '43212' and owner_name = '李四' where owner_code = '13245' and owner_name = '張三';
執(zhí)行之前的記錄是這樣的:
執(zhí)行之后的記錄是這樣的:
可以看到老赤,結(jié)果并不像這位開發(fā)同學(xué)說的“好像沒有效果”臼膏,實際上是有效果的:
why?
看起來仿畸,語法是完全沒有問題危尿,翻了翻MySQL官方文檔的update語法:
看到assignment_list的格式是以逗號分隔的col_name=value列表呐萌,一下子豁然開朗,開發(fā)同學(xué)想要的多字段更新語句應(yīng)該這樣寫:
倒回去再重試驗一把:
果然脚线,這下得到了想要的結(jié)果搁胆!
小結(jié) : 在一條UPDATE語句中弥搞,如果要更新多個字段邮绿,字段間不能使用“AND”,而應(yīng)該用逗號分隔攀例。
后記 :后面等有空的時候船逮,又回過頭來看了一下,為什么使用“AND”分隔的時候粤铭,會出現(xiàn)owner_code=0的奇怪結(jié)果挖胃?多次嘗試之后發(fā)現(xiàn):
等價于:
而 ('43212' and owner_name='李四') 是一個邏輯表達(dá)式,而這里不難知道owner_name并不是‘李四’梆惯。
因此酱鸭,這個邏輯表達(dá)式的結(jié)果為 false , false在MySQL中等價于0垛吗!