我有一个带有游戏的表(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()输出一起使用,对吗?
谢谢
答案 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`