欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL update set 和 and的區(qū)別

 更新時間:2021年05月08日 11:26:11   作者:王文安@DBA  
這篇文章主要介紹了MySQL update set 和 and的區(qū)別,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下

問題描述

最近接到一個奇怪的咨詢,update 語句執(zhí)行沒有報錯,但是沒有更新數(shù)據(jù),具體有問題的語句類似于如下形式:

update test.stu set cname = '0' and math = 90 and his = 80 where id = 100;

原因分析

直觀上看,這個 update 語句的語法是有問題的,正常更新多列數(shù)據(jù)的語法應(yīng)該是用逗號,類似于如下形式:

update test.stu set cname = '0',math = 90,his = 80 where id = 100;

直接用 and 第一反應(yīng)其實是會報語法錯誤,不太像是能正常執(zhí)行的。那么基于騰訊云數(shù)據(jù)庫 MySQL,實際構(gòu)造一個簡單的場景,嘗試復(fù)現(xiàn)一下這個問題。

SQL 語句如下:

CREATE TABLE `stu` (
  `id` int(11) NOT NULL,
  `sname` varchar(16) NOT NULL,
  `cname` varchar(8) DEFAULT NULL,
  `math` int(11) NOT NULL,
  `eng` int(11) DEFAULT NULL,
  `his` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

insert into stu values(100,'sam','0',90,88,83);
insert into stu values(101,'jhon','1',97,82,81);
insert into stu values(102,'mary','2',87,89,92);
insert into stu values(103,'adam','2',87,89,92);

然后分別試一試正常的 update 語句和使用 and 的 update 語句,看一下實際的運(yùn)行結(jié)果:

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update test.stu set cname = '0' and math = 90 and his = 80 where id = 100;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

mysql> select * from stu;
+-----+-------+-------+------+------+------+
| id  | sname | cname | math | eng  | his  |
+-----+-------+-------+------+------+------+
| 100 | sam   | 0     |   90 |   88 |   83 |
| 101 | jhon  | 1     |   97 |   82 |   81 |
| 102 | mary  | 2     |   87 |   89 |   92 |
| 103 | adam  | 2     |   87 |   89 |   92 |
+-----+-------+-------+------+------+------+
4 rows in set (0.00 sec)

mysql> update test.stu set cname = '0',math = 90,his = 80 where id = 100;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from stu;
+-----+-------+-------+------+------+------+
| id  | sname | cname | math | eng  | his  |
+-----+-------+-------+------+------+------+
| 100 | sam   | 0     |   90 |   88 |   80 |
| 101 | jhon  | 1     |   97 |   82 |   81 |
| 102 | mary  | 2     |   87 |   89 |   92 |
| 103 | adam  | 2     |   87 |   89 |   92 |
+-----+-------+-------+------+------+------+
4 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql>

可以看到這兩個語句確實都不會報錯,且?guī)?and 的 update 語句匹配到了具體的行(Rows matched: 1),但是沒有修改數(shù)據(jù)(Changed: 0),標(biāo)準(zhǔn)語法下的 update 語句倒是正常修改了數(shù)據(jù)。

由此可見,MySQL 在語法上,并不認(rèn)為 and 這個用法是錯誤的,那么說明 MySQL 用另外的方式“解讀”了這個語句。最容易想到的,就是 MySQL 是不是在 set 的時候,把 and 解釋成了邏輯運(yùn)算符,而不是英文意義上的“和”?而且 cname 的取值本來就是 0,也符合數(shù)據(jù)庫處理 bool 數(shù)據(jù)時的行為(用 0 和 1 代替 False 和 True)。

驗證起來很簡單,換個 cname 不為 0 的數(shù)據(jù) update 一下就可以了:

mysql> select * from stu;
+-----+-------+-------+------+------+------+
| id  | sname | cname | math | eng  | his  |
+-----+-------+-------+------+------+------+
| 100 | sam   | 0     |   90 |   88 |   83 |
| 101 | jhon  | 1     |   97 |   82 |   81 |
| 102 | mary  | 2     |   87 |   89 |   92 |
| 103 | adam  | 2     |   87 |   89 |   92 |
+-----+-------+-------+------+------+------+
4 rows in set (0.00 sec)

mysql> begin;update test.stu set cname = '0' and math = 90 and his = 80 where id = 101;
Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from stu;
+-----+-------+-------+------+------+------+
| id  | sname | cname | math | eng  | his  |
+-----+-------+-------+------+------+------+
| 100 | sam   | 0     |   90 |   88 |   83 |
| 101 | jhon  | 0     |   97 |   82 |   81 |
| 102 | mary  | 2     |   87 |   89 |   92 |
| 103 | adam  | 2     |   87 |   89 |   92 |
+-----+-------+-------+------+------+------+
4 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

從結(jié)果來看,MySQL 修改 cname 的值為 0,說明確實是當(dāng)成邏輯運(yùn)算符來處理了,仔細(xì)分析這個語句,會發(fā)現(xiàn) MySQL 按照如下方式來處理:

set cname = ('0' and math = 90 and his = 80)

math 和 his 的取值是根據(jù) where 條件篩選的行來決定的,實際對應(yīng)到上面測試的場景,會變成如下的邏輯判斷:

'0' and 97 = 90 and 81 = 80

PS:需要注意,即便是字符型的數(shù)據(jù) 0,也會被當(dāng)做 False。

解決方案

目前并不能通過 sql_mode 或者其他參數(shù)的形式來阻止這種帶 and 的 update 語句,因此這一類問題的隱蔽性比較強(qiáng)。建議在開發(fā)的時候,利用封裝好的框架,或者加強(qiáng)代碼或者 SQL review 來避免這個問題。

PS:騰訊云數(shù)據(jù)庫 MySQL 也會有類似的問題,需要警惕。

以上就是MySQL update set 和 and的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于MySQL update set 和 and的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mysql命令大全(詳細(xì)篇)

    Mysql命令大全(詳細(xì)篇)

    這篇文章主要介紹了Mysql命令大全,這里整理的算是比較詳細(xì)的,需要的朋友可以參考下
    2015-11-11
  • MySQL外鍵約束(FOREIGN KEY)案例講解

    MySQL外鍵約束(FOREIGN KEY)案例講解

    這篇文章主要介紹了MySQL外鍵約束(FOREIGN KEY)案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • MySQL性能優(yōu)化之一條SQL在MySQL中執(zhí)行的過程詳解

    MySQL性能優(yōu)化之一條SQL在MySQL中執(zhí)行的過程詳解

    天天和數(shù)據(jù)庫打交道,一天能寫上幾十條 SQL 語句,但你知道系統(tǒng)是如何和數(shù)據(jù)庫交互的嗎?下面這篇文章主要給大家介紹了關(guān)于MySQL性能優(yōu)化之一條SQL在MySQL中執(zhí)行的過程的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • mysql錯誤代碼之1064的解決方案

    mysql錯誤代碼之1064的解決方案

    這篇文章主要介紹了mysql錯誤代碼之1064的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • mysql登錄遇到ERROR 1045問題解決方法

    mysql登錄遇到ERROR 1045問題解決方法

    mysql登錄時出現(xiàn)了錯誤:ERROR 1045: Access denied for user,究竟是什么原因呢?接下來為你詳細(xì)介紹下,感興趣的你可以參考下哈,或許可以幫助到你
    2013-03-03
  • 教你使用idea連接服務(wù)器mysql的步驟

    教你使用idea連接服務(wù)器mysql的步驟

    這篇文章主要介紹了如何使用idea連接服務(wù)器上的mysql,具體步驟本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • mysql 5.7.19 winx64免安裝版配置教程

    mysql 5.7.19 winx64免安裝版配置教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.19 winx64免安裝版配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 關(guān)于MySQL表中沒有主鍵時如何找到重復(fù)的數(shù)據(jù)

    關(guān)于MySQL表中沒有主鍵時如何找到重復(fù)的數(shù)據(jù)

    這篇文章主要來和探討一下關(guān)于MySQL表中沒有主鍵時,該如何找到重復(fù)的數(shù)據(jù),文中的示例代碼講解詳細(xì),具有一定的參考價值,需要的可以了解一下
    2023-06-06
  • MySQL定時任務(wù),清理表數(shù)據(jù)方式

    MySQL定時任務(wù),清理表數(shù)據(jù)方式

    這篇文章主要介紹了MySQL定時任務(wù),清理表數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • MySQL存儲過程的權(quán)限問題小結(jié)

    MySQL存儲過程的權(quán)限問題小結(jié)

    這篇文章主要介紹了MySQL存儲過程的權(quán)限問題小結(jié)及mysql 創(chuàng)建存儲過程權(quán)限問題,感興趣的朋友一起看看吧
    2018-04-04

最新評論