【问题标题】:MySQL: SELECT...GROUP BY causes "Table is read only " errorMySQL:SELECT...GROUP BY 导致“表为只读”错误
【发布时间】:2015-07-02 19:48:18
【问题描述】:

我在装有 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 文件,但没有发现任何对我有帮助的东西。

【问题讨论】:

  • Group by 通常是在聚合数据时,您不会在这里这样做。也许您的意思是ORDER BY 而不是group by
  • 不,我的意思是“分组依据”,需要“分组依据”
  • 除非您聚合 Col2 和 Col3,否则该查询的输出将给您不可靠的结果。这个链接能回答你的问题吗? stackoverflow.com/questions/9575914/table-is-read-only
  • 好的,但是上面的语法在除 mySQL 之外的任何数据库中都是无效的,因为它 extends the group by clause 所以你可以在 mySQL 中没有聚合但在其他地方没有。至于为什么这不起作用。我说不出来。
  • @doublelateralstickytape 我之前检查过链接,但我没有看到问题的原因,因为我可以在 Col1 上执行 SELECT ...GROUP BY。我没有看到将权限传递给表格列的选项?

标签: mysql


【解决方案1】:

你说:

Col1 和 Col2 上有索引,但 Col3 上没有。怎么可能?

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

EXPLAIN SELECT 应该显示失败的查询正在按照using temporary, using filesort 的方式为分组做一些事情,这意味着它不是只读的基表本身,而是正在发生的事情是无法使用索引的分组所需的临时表遇到操作系统权限问题。

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

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

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

【讨论】:

  • 谢谢,我更新了我的帖子。它与GROPU BY 语句无关,它更笼统。可能是桌子坏了?
猜你喜欢
  • 2013-04-25
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多