1. 問題
已經有很多數據的按照業務邏輯分表的一系列表修改一個字段(類型,如-1:默認值,1:表示'人員id',2:表示‘公司id’)的注釋
2. 解決方法
1> 使用alter table方法
ALTER TABLE table_name MODIFY COLUMN column_name TINYINT(tinyint表示column類型) COMMENT '-1:默認值,1:人員id,2:公司id';
這種方法會重建表,如果數據量大,一個表100w數據,執行1min,如果分表數30個那就總共需要執行30min
2> 使用元數據表
USE information_schema;
UPDATE COLUMNS t SET t.column_comment = '-1:默認值,1:人員id,2:公司id' WHERE t.TABLE_SCHEMA='database_name' AND t.table_name='table_name' AND t.COLUMN_NAME='column_name ';
查詢語句,更新前可以查詢一下
SELECT t.column_comment FROM COLUMNS t WHERE t.TABLE_SCHEMA='database_name' AND t.TABLE_NAME='table_name' AND t.COLUMN_NAME='column_name ';
本想這種修改元數據的方法可以修改表的字段注釋,但是沒有權限執行,錯誤如下:
錯誤代碼: 1044
Access denied for user 'usr'@'%' to database 'information_schema'
咦?這是為毛呢???!!!
想法很豐滿,現實很骨感。
官方解釋:
INFORMATION_SCHEMA是信息數據庫,其中保存着關於MySQL服務器所維護的所有其他數據庫的信息。在INFORMATION_SCHEMA中,有數個只讀表。它們實際上是視圖,而不是基本表,因此,你將無法看到與之相關的任何文件。
每位MySQL用戶均有權訪問這些表,但僅限於表中的特定行,在這類行中含有用戶具有恰當訪問權限的對象。
事實上,盡管不需要生成名為INFORMATION_SCHEMA的文件,我們仍提供了名為INFORMATION_SCHEMA的新數據庫。可以使用USE語句將INFORMATION_SCHEMA選擇為默認數據庫,但訪問該數據庫中所含表的唯一方式是使用SELECT語句。不能在其中插入內容,不能更新它們,也不能刪除其中的內容。
網摘:
Mysql沒有Oracle那么方便,修改注釋的時候需要指定{type}(這是Mysql設計的不合理性!);系統數據字典表COLUMNS中有保存所有表的字段信息,但是系統字典表是只讀的,無法修改注釋;
所以,Mysql修改注釋必須按照上面的格式對不同類型做判斷,並且帶有長度的字段必須指明length與decimals,否則更新注釋的時候會修改length,decimals為默認值的;
修改Mysql注釋是件麻煩的事情,但是也只能這樣了
3> 難道就沒有別的方法了?
Are you kidding?!如果沒有別的辦法了我會寫3!!!
當對於一個大表進行ALTER TABLE的時候,性能問題就產生了。MySQL大部分改動的步驟如下:根據新的表結構創建一個空表,從舊表中把數據取出來插入到新表中,在刪除舊表。這是個非常漫長的過程。許多人ALTER TABLE之后,都有等待1小時或者1天的痛苦經歷。
你可以這樣,新建一個表,改變那個列的comment,然后原始實例關閉,替換.frm文件,再重啟。
詳情請咨詢dba,這可是個技術活,我等rd表示一頭霧水。可以參考
4> 我等RD難道會因為改不了column注釋就此放棄嗎?
R U kidding again?!!
妥協方案,修改你的程序DB實體注釋,大部分實體注釋和DB注釋一致,但是如果遇到頻繁增加type類型這種情況。。。還是跟DB實體加注釋吧,或者如果有枚舉類型,枚舉里描述清楚,這樣起碼讓后來人能夠不那么迷茫
吐槽:mysql真傻,真的...