dml中的and使用誤區

2021-08-02 05:56:55 字數 2233 閱讀 3342

下午剛剛在乙個jira變更中的遇到問題,非常容易產生誤使用,產生比較大的危害。大家看下。非常簡單的一條sql:

mysql> update order_original set audit_status=3 and is_queue=1 where id=16682331;

query ok, 0 rows affected (0.00 sec)

rows matched: 1 changed: 0 warnings: 0

很快就執行完了。但是,大家留意到沒? changed: 0 ,即雖然rows matched: 1,確實有 id=16682331這一行,但是沒有更新成功。這時,很多人肯定想到,這裡肯定就是已經被更新過了啊。我們來看下:

mysql> select audit_status,is_queue from order_original where id=16682331;

+--------------+----------+

| audit_status | is_queue |

+--------------+----------+

| 1 | 1 |

+--------------+----------+

1 row in set (0.00 sec)

是不是很奇怪,並不是我們想要的結果。ok,我們把sql改變一下寫法:

mysql> update order_original set audit_status=3, is_queue=1 where id=16682331;

query ok, 1 row affected (0.00 sec)

rows matched: 1 changed: 1 warnings: 0

注意,是不是已經是changed: 1 ?我們例項再查一下:

mysql> select audit_status,is_queue from order_original where id=16682331;

+--------------+----------+

| audit_status | is_queue |

+--------------+----------+

| 3 | 1 |

+--------------+----------+

1 row in set (0.00 sec)

確實資料update成功了。到這裡大家應該明白了吧。如果還不明白,我們再做乙個更明顯的實驗,幫忙看清本質的原因:

mysql> create table test(a int,b int,c int);

query ok, 0 rows affected (0.01 sec)

mysql> insert into test values(1,2,3);

query ok, 1 row affected (0.00 sec)

mysql> update test set b=99 and c=3 where a=1;

query ok, 1 row affected (0.00 sec)

rows matched: 1 changed: 1 warnings: 0

mysql> select * from test;

+------+------+------+

| a | b | c |

+------+------+------+

| 1 | 1 | 3 |

+------+------+------+

1 row in set (0.00 sec)

mysql> update test set b=99 and c=5 where a=1;

query ok, 1 row affected (0.00 sec)

rows matched: 1 changed: 1 warnings: 0

mysql> select * from test;

+------+------+------+

| a | b | c |

+------+------+------+

| 1 | 0 | 3 |

+------+------+------+

1 row in set (0.01 sec)

即在update中,set 列=值,這個等號後面把and看成乙個位運算,當後面的結果存在或正確時(set b=99 and c=3),那就是set 列=1,錯誤或不存在時(set b=99 and c=5)就是0。

因此必須避免在update的列更新中使用and。切記。

電腦使用中的幾個誤區

1.正確開關機 養成正常的開關機習慣是很有必要的,在 xp作業系統下 按一下電腦開關鍵就自動進行開機 一直等到完全進入桌面系統前不要進行任何的操作 除非有問題進不了系統 正常情況下都是可以進入桌面的 如果想關機 有些朋友不喜歡按正常順序 點開始 關閉計算機,關閉 那也可以通過再按電腦主機上的開關鍵一...

sizeof使用中的幾個誤區總結

例如 char ss2 0123456789 sizeof ss2 結果為11,而不是10 字元陣列ss2中包含隱含的 0 也算乙個字元,佔乙個位元組,所以ss2的總的大小為11位元組。結構體的sizeof涉及到位元組對齊問題。為什麼需要位元組對齊?計算機組成原理教導我們這樣有助於加快計算機的取數速...

C Vector的使用誤區

初始化vector並傳引用到dll中,dll中為該引用新增節點,vector記憶體釋放時會報堆疊錯誤,原因?這個問題其實挺好避免的,說白了就是不要乙個模組new,另乙個模組delete,不要認為你的vector的節點資料在棧上,vector的本質就是乙個變長陣列,怎麼會在棧上呢,資料肯定是在堆上的,...