我在Windows7PC上做管理员,使用XAMPP和Mysql QueryBrowser。数据库是只存储的,除了我,没有人在数据库中写入或读取数据库。
这些声明如预期的那样起作用:
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无关。从这些简单的查询中可以看出,更奇怪的是:
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文件,但没有发现任何帮助我的地方。
发布于 2015-07-03 19:35:03
你说:
在Col1和Col2上有一个索引,而在Col3上没有。这怎么可能呢?
我假设您的意思是只有一个索引(col1,col2)。此索引可用于GROUP BY col1,但不能用于任何其他分组。
EXPLAIN SELECT应该显示,失败的查询正在按照分组的using temporary, using filesort方式进行操作,这意味着只读取的不是基表本身,而是无法使用索引的临时表遇到的操作系统权限问题。
因此,它不是阻止您运行查询的MySQL,而是阻止MySQL对临时表进行所需操作的Windows。大概是文件系统权限。
MySQL错误日志中也可能有有用的消息。
https://dev.mysql.com/doc/refman/5.6/en/temporary-files.html
https://stackoverflow.com/questions/31193411
复制相似问题