Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 错误1143(42000):选择命令被拒绝_Mysql - Fatal编程技术网

Mysql 错误1143(42000):选择命令被拒绝

Mysql 错误1143(42000):选择命令被拒绝,mysql,Mysql,我使用具有更新权限的用户执行sql: update stu set age = 27 where name='zjw'; 我得到了这个错误: 错误1143(42000):选择拒绝给用户的命令 表“stu”中“name”列的“update_user”@“localhost” 如下表所示: CREATE TABLE `stu` ( `id` int(11) NOT NULL, `name` varchar(20) DEFAULT NULL, `age` int(11) DEFAULT

我使用具有更新权限的用户执行sql:

update stu set age = 27 where name='zjw';
我得到了这个错误:

错误1143(42000):选择拒绝给用户的命令 表“stu”中“name”列的“update_user”@“localhost”

如下表所示:

CREATE TABLE `stu` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)
更新用户的权限为:

grant update on *.* to 'update_user'@'%';
MySQL版本是5.1.73

谢谢。

当您执行

UPDATE `stu` SET age = 27 WHERE name = 'zjw';
SQL引擎必须首先选择需要更新的行

因此,如果您没有
SELECT
权限,即使您有
update
权限,也无法执行此类更新


查看手册中的。

@Robin根据您最后的评论,尝试理解您的更新声明-

UPDATE `stu` SET age = 27 WHERE name = 'zjw';
上面的update语句首先尝试获取name='zjw'所在的记录,因此,如果您的name列被索引,则选择use index并直接选择仅具有值'zjw'的记录,否则它将扫描整个表,并在表中的任何位置选择'zjw'

这意味着在更新之前,mysql首先在内部使用select语句,所以您还需要select权限和任何其他权限,如更新/删除等

所以你的授权命令应该是-

GRANT SELECT, UPDATE on db.* to 'myuser'@'localhost' identified by 'mypass';

您应该根据需要只授予特定IP或本地主机权限,而不是“%”全局权限,这是有风险的。

因为当在
更新中使用
where
子句时,数据库将
选择满足
where
条件的行,因此,在授予
update
权限时,需要
select
权限

其他读取列值的语句也需要SELECT权限。例如,UPDATE语句中col_name=expr赋值右侧引用的列或DELETE或UPDATE语句的WHERE子句中命名的列需要SELECT


错误与选择权限有关,但您给出了更新。。。您为什么不尝试授予实际导致错误的特权?错误
error 1143(42000):SELECT command DENITED to user
似乎非常具体。用户是否只有更新权限?或者它也有选择权。在查看错误时,授予SELECT权限似乎可以解决您的问题。在我向用户授予SELECT权限后,错误消失。但我也不明白为什么用户有更新权限,但它不能更新数据?谢谢,这就是我所困惑的。你的答案很好,谢谢。我在没有where子句的情况下尝试了以下sql:update stu set age=27,这是正确的。又来了。