我在使用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文件,但我发现没有任何帮助我。
答案 0 :(得分:1)
你说:
Col1和Col2上有索引但Col3上没有索引。怎么会这样?
我认为你的意思是(col1,col2)上有一个索引。该索引可用于GROUP BY col1
,但不能用于任何其他分组。
EXPLAIN SELECT
应该表明失败的查询正在为{group}进行分组,其含义是基本表本身不是只读的,但更确切地说,正在发生的操作系统权限问题是分组所必需的临时表遇到的,无法使用索引。
因此,MySQL不会阻止您运行查询,它的Windows阻止MySQL使用临时表执行所需的操作。可能是文件系统权限。
MySQL错误日志中可能还有一些有用的消息。
https://dev.mysql.com/doc/refman/5.6/en/temporary-files.html