MySQL中的列太多 - 错误1117

时间:2010-01-05 01:32:27

标签: mysql

我刚刚在mysql的表中添加了一个新字段,它回来时发出警告“1117:列太多了”

该表有(喘气) 1449列。我知道,我知道这是一个荒谬的列数,我们正在重构模式,但我需要扩展这个架构。也就是说,根据mysql文档,这似乎没有达到3398的理论极限。我们也没有接近每行64K的限制,因为我们目前在50K范围内。

警告不会阻止我向架构添加字段,因此不确定它是如何失败的。如果它似乎没有引起任何问题,我如何解释这个错误?

2 个答案:

答案 0 :(得分:2)

也许其中一些因素会增加总字节数:

http://dev.mysql.com/doc/refman/5.5/en/column-count-limit.html

例如,如果一个列允许使用空值,那么就会增加总数,或者如果使用了unicode,那么这会使字符列所需的空间增加三倍......等等。

表示MyISAM:

row length =
  1 +
  (sum of column lengths) +
  (number of NULL columns + delete_flag + 7)/8 +
  (number of variable-length columns)

你可以通过添加一个tinyint not null列,然后删除它并添加一个char(x)列直到你收到错误来检查它是否确实是行大小问题或列数问题。

答案 1 :(得分:1)

警告完全:警告。这意味着你现在没事,但是,如果你继续发出引发警告的行为,你以某种形式受到惩罚(我只是试图将这个概念传达给我现在三岁的女儿如果看起来有点过分的话,请原谅我。)

这是MySQL的礼貌。下一步,如果你继续沿着这个特定的道路走下去就是拒绝合作(可能)或者完全失去你的数据(不太可能但是以一种黑暗幽默的方式运用),这两者都不是你想要的。

正确的回应是倾听它告诉你的内容。如果您在考虑重构的最佳方法时需要快速修复,则可以使用公共标识符将行拆分为两个表。

这将使您的查询(暂时)难看,但至少会停止警告。但使用它作为最终解决方案。我发现很难想象一个项目会有数千个属性无法组织成更好的层次结构。