2010-01-05 36 views
4

我只是在mysql中增加了一個新的領域,以我的表,並使用的警告回來了「1117:太多的列」在MySQL的列太多 - 錯誤1117

表有(GASP) 1449列。我知道,我知道這是一個荒謬的列數,我們正在重構模式的過程中,但是我需要將這個體系結構稍微擴展一些。也就是說,按照mysql文檔,這似乎沒有達到3398的理論極限。我們也沒有接近每行64K的限制,因爲我們現在在50K範圍內。

該警告並不妨礙我添加字段到模式,所以不知道它如何失敗,如果有的話。考慮到它似乎沒有引起任何問題,我該如何解釋這個錯誤?

+3

設計它的人是否錯誤了行的列,並不斷添加前者?重構那混亂,現在。不要把它「擴大一點」。 – 2010-01-05 01:43:08

+1

100列= *(喘氣)*。 1000列= *修正它!* – Aaronaught 2010-01-05 01:49:33

+0

甜googly moogly。 – Joe 2010-01-05 01:52:21

回答

1

警告是恰好是即:警告。這意味着你現在還好,但如果你繼續引發警告的行爲,你會以某種形式受到懲罰(我只是想把這個概念貫穿到我三歲的時候女兒在此刻如此原諒我,如果它似乎有點簡單)。

這就是MySQL的禮貌。這是下一步,如果你繼續走下去,這條路就是拒絕合作(很可能)或者失去你的數據(不太可能,但是以一種幽默的幽默方式),這兩者都不是你想要的。

正確的迴應是聽聽它告訴你什麼。如果您想在重構最佳方法時想做快速修復,則可以使用通用標識符將行分割爲兩個表。

這將使您的查詢(暫時)很醜,但至少會停止警告。但不要使用此作爲最終解決方案。我發現很難想象一個項目會有成千上萬的屬性無法組織成更好的層次結構。

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)列直至出現錯誤。