我在一台装有 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/