gpt4 book ai didi

mysql - 由于 `safe update mode` 导致查询失败

转载 作者:行者123 更新时间:2023-11-29 11:34:01 24 4
gpt4 key购买 nike

我有下表:

CREATE TABLE `number_locks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`number` varchar(255) NOT NULL,
`timeout` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `number` (`number`),
KEY `timeout` (`timeout`)
) ENGINE=InnoDB AUTO_INCREMENT=69146 DEFAULT CHARSET=latin1

现在我想在其中运行这个准备好的删除语句:

> SET @number="123123";
Query OK, 0 rows affected (0.17 sec)

> PREPARE delete_number_lock FROM 'DELETE FROM number_locks WHERE number=? OR timeout<NOW()';
Query OK, 0 rows affected (0.17 sec)
Statement prepared

> EXECUTE delete_number_lock USING @number;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

我不明白为什么它认为没有使用 KEY 列的 where 条件。

最佳答案

默认情况下,mysql 以安全更新模式运行,这可以帮助用户对数据库进行任何意外修改。正如您在 MYSQL REFERENCE MANUAL 中看到的那样其中说

It is helpful for cases when you might have issued a DELETE FROM tbl_name statement but forgotten the WHERE clause. Normally, such a statement deletes all rows from the table. With --safe-updates, you can delete rows only by specifying the key values that identify them. This helps prevent accidents.

安全模式还拒绝 where 子句不使用键列或约束的语句,如手册进一步所述

You are not permitted to execute an UPDATE or DELETE statement unless you specify a key constraint in the WHERE clause or provide a LIMIT clause (or both)

在您的情况下,删除查询不使用键约束,因此不会执行。

因此要禁用安全模式,请尝试以下操作:

SET SQL_SAFE_UPDATES=0;

<小时/>

更多更新

查看您的查询DELETE FROM number_locks WHERE number=? OR timeout<NOW()

这里是专栏number不是键列,因此会出现错误。如果您使用 id而不是number不会发生这样的错误,因为 id是主键。

<小时/>

更多更新

OR分隔您的WHERE子句分成两个逻辑部分。让我解释一下number="12345" OR timeout<NOW()变成 (number || timeout) 这不是一个键。但使用 AND 的条件之所以有效,是因为它将两个列一起考虑在内。另外值得注意的是 OR如果您使用相同的列名称,例如 number="12345" OR number='564789' 将起作用

关于mysql - 由于 `safe update mode` 导致查询失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36920893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com