更新语句 MySQL 将 `WHERE` 条件更改为 `AND` 产生了错误的结果
update statement MySQL changing `WHERE` condition with `AND` produced wrong results
我有以下 table 它有更多列,但它们不相关:
CREATE TABLE `vicidial_lists` (
`list_id` bigint(14) unsigned NOT NULL,
`list_name` varchar(50) DEFAULT NULL
);
错误地在以下查询中错误地将 WHERE
条件替换为 AND
并且未使用限制:
update vicidial_lists set list_name = replace(list_name, '15.10.2021', '15.11.2021') and list_id IN (73227,73228,73229,73230,73231) ;
此查询将 table vicidial_lists
的所有 list_names
更改为大部分 0
和 1
.
中的一些记录
LIST ID LIST NAME
73227 0
73228 0
73229 0
73231 1
问题已解决,我从备份中返回了正确的名称。
我试图在 MySQL
文档中阅读有关此行为的信息,或者它是否被列为错误,但我没有找到任何内容。
我试图理解为什么会这样。
我的问题,比较明白为什么是:
Has anyone faced the same behavior , is it listed as a bug ? Any link provided with related information would be greatly appriciated.
MySQL
版本:5.6.28
这不是错误,而是 MySQL 中的有效语句。
当缺少 WHERE
子句时,UPDATE
将在所有行上完成。您为 list_name
列设置的值将是以下布尔表达式的结果:
replace(list_name, '15.10.2021', '15.11.2021') and list_id IN (73227,73228,73229,73230,73231)
成为:
TRUE AND TRUE => 1
或
TRUE AND FALSE => 0
replace
-函数 returns 一个字符串(将被评估为 TRUE)和 IN
-子句将评估 TRUE 或 FALSE。 TRUE 和 FALSE 在 MySQL 中被处理为 1 和 0,因此 list_name
将接收 0 或 1。
我有以下 table 它有更多列,但它们不相关:
CREATE TABLE `vicidial_lists` (
`list_id` bigint(14) unsigned NOT NULL,
`list_name` varchar(50) DEFAULT NULL
);
错误地在以下查询中错误地将 WHERE
条件替换为 AND
并且未使用限制:
update vicidial_lists set list_name = replace(list_name, '15.10.2021', '15.11.2021') and list_id IN (73227,73228,73229,73230,73231) ;
此查询将 table vicidial_lists
的所有 list_names
更改为大部分 0
和 1
.
LIST ID LIST NAME
73227 0
73228 0
73229 0
73231 1
问题已解决,我从备份中返回了正确的名称。
我试图在 MySQL
文档中阅读有关此行为的信息,或者它是否被列为错误,但我没有找到任何内容。
我试图理解为什么会这样。
我的问题,比较明白为什么是:
Has anyone faced the same behavior , is it listed as a bug ? Any link provided with related information would be greatly appriciated.
MySQL
版本:5.6.28
这不是错误,而是 MySQL 中的有效语句。
当缺少 WHERE
子句时,UPDATE
将在所有行上完成。您为 list_name
列设置的值将是以下布尔表达式的结果:
replace(list_name, '15.10.2021', '15.11.2021') and list_id IN (73227,73228,73229,73230,73231)
成为:
TRUE AND TRUE => 1
或
TRUE AND FALSE => 0
replace
-函数 returns 一个字符串(将被评估为 TRUE)和 IN
-子句将评估 TRUE 或 FALSE。 TRUE 和 FALSE 在 MySQL 中被处理为 1 和 0,因此 list_name
将接收 0 或 1。