2011-01-20 46 views
4

當前列是VARCHAR(255)NOT NULL,那麼如何將其更改爲TEXT NOT NULL?MySQL:如何將varchar(255)UNIQUE列更改爲UNIQUE文本NOT NULL?

注意:要更改其屬性類型的列是另一列的UNIQUE KEY組合。例如。

UNIQUE KEY(名稱,說明)

列描述當前在VARCHAR(255)。它不能因爲這樣可以改變:

ERROR 1170(42000):BLOB /文本列中的密鑰規範沒有一個密鑰長度

我需要它是TEXT '描述',否則我需要重新創建整個事物?我已經有一些乏味和重要的數據了。重新創建會很麻煩。

+1

可以通過Google搜索輕鬆獲得答案 – 2011-01-20 07:53:10

+0

請重新閱讀該問題。對不起。 – woel 2011-01-20 08:06:01

回答

12

你打算使用TEXT列作爲UNIQUE KEY的一部分嗎? 這非常低效!不要這樣做! 我強烈建議你:

  • 添加一個名爲例如'description_hash' char(32) not null default ''
  • 附加列商店description場到其中的哈希值。例如。 description_hash=MD5(description)
  • 更改您的鑰匙UNIQUE KEY (name, description_hash)

Ofcourse你需要保持description_hash列了最新的在你的代碼,但看到的 - 在大多數情況下,需要的只是很少的代碼更改。 或者你可以使用觸發器來處理這個。

1
alter table your_table 
modify column your_column text not null; 

爲唯一密鑰

alter table your_table 
add unique index your_index_name (your_column(your_length)); 

your_length =允許多達1000個字節

的最大密鑰長度爲1000個字節。這也可以通過改變源代碼和重新編譯來改變。一鍵超過250個字節,比1024個字節的缺省使用


兩個長度較大的密鑰塊大小(介紹+另一列不能超過1000更長),所以

較長的情況下
alter table your_table 
add unique index your_index_name (description(800), another_column(200)); 
+0

嘿,對不起,我正在更新我的問題。問題應該是該專欄也是一個獨特的關鍵。 – woel 2011-01-20 08:00:32

4

我有完全相同的問題。

我添加了一個新的字符(32)列(我稱之爲hash並添加了一個唯一索引)和兩個觸發器。

delimiter | 

CREATE TRIGGER insert_set_hash 
    BEFORE INSERT ON my_table_name 
    FOR EACH ROW BEGIN 
      SET NEW.hash = MD5(NEW.my_text); 
    END; | 

CREATE TRIGGER update_set_hash 
    BEFORE UPDATE ON my_table_name 
    FOR EACH ROW BEGIN 
      SET NEW.hash = MD5(NEW.my_text); 
    END; | 


delimiter ; 

通過使用觸發器和哈希添加一個唯一索引,可以肯定的是,哈希值將始終保持最新的和獨特的。