2012-01-26 20 views
9

我得到了與遊戲的表(InnoDB的)一個MySQL數據庫:如何爲已經在使用的表添加varchar字段?

gamerooms 
id: bigint(20) unsigned not null auto_increment 
PRIMARY KEY (`id`) 

我想開始產生於各行的UUID值,我可以公開分享,是這樣的:

gamerooms 
id | id_public | 
-------------------- 
1 | abcde 
2 | ghijk 
3 | lmnop 
    ... 

select * from gamerooms where id_public = ... 

如何添加此新列,同時請記住表中已有記錄?我很困惑,因爲列應標明NOT NULL,但加入後列,已經存在的所有記錄將有空值..我一定要提供一個默認值?:

ALTER TABLE `gamerooms` ADD COLUMN `id_public` varchar(36) DEFAULT something AFTER `id` 

我想在創建後在id_public上放置一個索引,所以不確定如果第一次創建列後的空值將會弄亂任何東西。

此外,我可以使用varchar(36)與mysqls UUID()輸出,對嗎?

謝謝

+0

如果沒有爲現有項目分配有意義的值,爲什麼要標記列「NOT NULL」? – Borealid

回答

21

ALTER說法正確的是:

ALTER TABLE `gamerooms` 
ADD COLUMN `id_public` varchar(36) NOT NULL DEFAULT 'something' AFTER `id` 

根據我的MySQL袖珍參考,如果你不提供被定義爲NOT NULL列中的默認值:

MySQL的挑選基於場

012的類型的值

在這種情況下,我猜默認情況下會是空字符串。一旦你的列添加,只需創建該列的新指標,並利用重建索引空改變指令,像這樣:

CREATE INDEX myIndex ON gamerooms(id_public); 
ALTER TABLE gamerooms ENGINE = InnoDB; 

您可以同時創建索引你做插入。我的MySQL-fu不夠強大,不知道該怎麼做。

1

創建此新列後,現有記錄是否應具有值?如果是的話,你可以通過多個步驟來做到這一點。首先,如果沒有約束或索引創建新列,然後回來的UUID填充它爲所有現有的記錄。一旦所有東西都被填充,添加非空約束和索引。

0

作爲UUID是一個128位的數字,你不需要varchar列來存儲它。一個char(16)列就可以保存UUID二進制數據。

ALTER TABLE `gamerooms` ADD COLUMN `id_public` char(16) NOT NULL DEFAULT '' AFTER `id` 
相關問題