如何为已经在使用的表添加varchar字段?

时间:2012-01-26 02:33:03

标签: mysql

我有一个带有游戏的表(InnoDB)的mysql数据库:

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()输出一起使用,对吗?

谢谢

3 个答案:

答案 0 :(得分:24)

您的ALTER声明是正确的:

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

根据我的MySQL Pocket Reference,如果你没有为定义为NOT NULL的列提供默认值:

  

MySQL根据字段的类型选择一个值

在这种情况下,我猜测默认是空字符串。添加完列后,只需为该列创建一个新索引,然后使用 null alteration 指令重建索引,如下所示:

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

您可以在插入的同时创建索引。我的MySQL-fu不够强大,不知道如何做到这一点。

答案 1 :(得分:1)

创建此新列后,现有记录是否具有值?如果是,您可以通过多个步骤执行此操作。首先,创建没有约束或索引的新列,然后使用UUID为所有现有记录填充它。填充完所有内容后,添加非空约束和索引。

答案 2 :(得分:0)

由于UUID是128位数字,因此您不需要varchar列来存储它。一个char(16)列可以保存UUID二进制数据。

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