MySQL数据库错误:列太多

时间:2016-07-11 18:14:31

标签: mysql

我正在运行以下查询来从表中转移数据:

SELECT 
time_stamp,
SUM(CASE WHEN sensor_id=000001 THEN temp ELSE 0 END) AS 'temp_000001',
SUM(CASE WHEN sensor_id=000002 THEN temp ELSE 0 END) AS 'temp_000002',

...

SUM(CASE WHEN sensor_id=003372 THEN temp ELSE 0 END) AS 'temp_003372'

FROM sensor_data
GROUP BY time_stamp

查询应返回包含3372列和8928行(不同time_stamps的数量)的结果集。我收到一个“太多列”错误,这很奇怪,因为查询以前工作过。 sensor_data包含8928个时间点的3372个传感器的测量值。如果我在一个表上运行相同的查询,该表包含在288个时间点测量的3372个传感器,则它可以工作。所以列的数量确实不是问题。

2 个答案:

答案 0 :(得分:2)

MySQL中的最大列数具有欺骗性。

它可以是4096(这是源中记录的MAX_FIELDS),但它也可以低得多,具体取决于列的名称

血腥的细节在这里:Understanding the Maximum Number of Columns in a MySQL Table

您之前可能还有查询工作,因为它没有创建临时表。也许时间戳列已经被编入索引,而且它已经不再了?

答案 1 :(得分:0)

您似乎遇到了计算GROUP BY所需的临时表的行长度问题。列数的硬限制为4096,您似乎没有达到,但行长度限制为64K(没有blob)。你可以尝试解决这个问题:

  • temp替换为cast(temp as signed)或使用其他一些强制转换技巧强制表达式为需要尽可能少存储量的类型
  • 将查询拆分为union两个group by个查询
  • 使用time_stamp列手动创建临时结果表,并且所有结果列都是可能的最小存储类型,并使用insert into ... select ... on duplicate key update ...手动填充 - 然后从该表中读取结果 - 基本上执行穷人group by亲手动手。
  • 将temp的类型更改为数据允许的最小值。您可以通过select temp from sensor_data procedure analyse()
  • 从MySQL获得推荐