MySQL:SELECT...GROUP BY 导致 "Table is read only "错误

标签 mysql

我在一台装有 XAMPP Server 和 Mysql QueryBrowser 的 Windows 7 PC 上担任管理员。数据库只是存储,除了我之外没有人在其中写入或读取。

这些语句按预期工作:

Select Col1, Col2, Col3 from Table1 
Select Col1, Col2, Col3 from Table1 Group by Col1

以下各语句

Select Col1, Col2, Col3 from Table1 Group by Col2
Select Col1, Col2, Col3 from Table1 Group by Col3
Select Col1, Col2, Col3 from Table1 Group by Col1,Col2,Col3

给出以下输出

#1036 - Table 'Table1' is read only 

Col1 和 Col2 上有索引,但 Col3 上没有索引。怎么会这样?

编辑:我发现它与 GROUP BY 无关。从这些简单的查询中可以看出,更奇怪的是:

SELECT count(*) FROM Table1 where Col2 > 3000;


EXPLAIN SELECT count(*) FROM Table1 where Col2 > 3000;
+----+-------------+----------------+-------+-----------------+--------+-----    +------+----------+--------------------------+
| id | select_type | table          | type  | possible_keys   | key    | key_len | ref  | rows     | Extra                    |
+----+-------------+----------------+-------+-----------------+--------+---------+------+----------+--------------------------+
|  1 | SIMPLE      | Table1         | range | Col2,Col7       | Col2   | 4       | NULL | 22315581 | Using where; Using index |
+----+-------------+----------------+-------+-----------------+--------+---------+------+----------+--------------------------+

工作正常。然而,

SELECT count(*) FROM Table1 where Col4 > '2009-01-01';

EXPLAIN SELECT count(*) FROM Table1 where Col4 > '2009-01-01';

+----+-------------+----------------+------+---------------+------+---------+------+-----------+-------------+
| id | select_type | table          | type | possible_keys | key  | key_len | ref  | rows      | Extra       |
+----+-------------+----------------+------+---------------+------+---------+------+-----------+-------------+
|  1 | SIMPLE      | Table1         | ALL  | NULL          | NULL | NULL    | NULL | 237089257 | Using where |
+----+-------------+----------------+------+---------------+------+---------+------+-----------+-------------+

报错

ERROR 1036 (HY000): Table 'Table1' is read only

我感谢 @Michael - sqlbot 的输入,并添加了 EXPLAIN ... 输出。但是,为什么一列会导致文件系统权限出现潜在问题,而另一列却不会呢?我检查了 XAMPP 目录中的 mysql_error 文件,但没有发现任何对我有帮助的信息。

最佳答案

你说:

There is an index on Col1 and Col2 but not on Col3. How can that be?

我假设你的意思是(col1,col2)上有一个索引。该索引可用于GROUP BY col1,但不能用于任何其他分组。

EXPLAIN SELECT 应该显示失败的查询正在执行类似于 使用临时文件排序 进行分组的操作,这意味着它不是基表本身是只读的,而是发生的情况是无法使用索引的分组所需的临时表遇到了操作系统权限问题。

因此,并不是 MySQL 阻止您运行查询,而是 Windows 阻止 MySQL 使用临时表执行其需要的操作。大概是文件系统权限。

MySQL 错误日志中也可能有有用的消息。

https://dev.mysql.com/doc/refman/5.6/en/temporary-files.html

关于MySQL:SELECT...GROUP BY 导致 "Table is read only "错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31193411/

相关文章:

php - 将订单 ID 分配给其产品

mysql - 如何通过选择另一个字段值来连接一个表和两个表

mysql - Laravel Eloquent : order results by field in related table

mysql - 如何转义查询中的多个引号?

javascript - 谁能告诉我为什么会出现MySQL语法错误?

mysql - 无法更新存储函数/触发器中的表 ‘xxx’,因为它已被调用此存储函数/触发器的语句使用

php - MySQL真正的转义-自己的转义-o到ö?

php - 如何修复 : no query results for model [App\User] error

java - Android:Fragment 中的 Setter 和 RecyclerViewAdapter 中的获取字符串

php - 如何使用 mysql 和 php 更新系统日期列