2012-01-26 16 views
9

Tengo una base de datos MySQL con una mesa (InnoDB) de Juegos:¿Cómo agregar un campo varchar para una tabla que ya está en uso?

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

me gustaría comenzar a generar un valor UUID para cada fila que puedo compartir públicamente, algo así como:

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

select * from gamerooms where id_public = ... 

¿Cómo agrego esta nueva columna, también teniendo en cuenta que ya hay registros en la tabla? Estoy confundido porque la columna se debe marcar NO NULO, pero después de la adición de la columna, todos los registros que ya existen tendría valores vacíos .. ¿Tengo que proporcionar un valor por defecto ?:

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

quiero ponga un índice en id_public, por supuesto, después de que se haya creado, por lo que no está seguro de si los valores nulos después de que se crea la columna por primera vez lo desordenarán.

Además, puedo usar varchar (36) con salida mysqls UUID(), ¿verdad?

Gracias

+0

¿Por qué marcar la columna 'NOT NULL' si no hay un valor significativo asignado para los elementos existentes? – Borealid

Respuesta

21

Su declaración ALTER es correcta:

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

De acuerdo con el bolsillo de referencia de MySQL, si no se proporciona un valor por defecto para una columna que se define como NOT NULL:

MySQL recoge un valor basado en el tipo del campo

En este caso, supongo que el valor predeterminado sería una cadena vacía. Una vez que su columna se ha añadido, basta con crear un nuevo índice para la columna, y reconstruir el índice mediante un nula alteración instrucción de este modo:

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

Usted puede ser capaz de crear el índice, al mismo tiempo que hacer la inserción. Mi MySQL-fu no es lo suficientemente fuerte como para saber cómo hacerlo.

1

¿Deberían los registros existentes tener un valor una vez que crea esta nueva columna? En caso afirmativo, puede hacer esto en varios pasos. Primero, cree la nueva columna sin restricción o índice y luego vuélvala a llenar con el UUID para todos los registros existentes. Una vez que todo esté completo, agregue la restricción no nula y sus índices.

0

Como un UUID es un número de 128 bits, no necesita una columna varchar para almacenarlo. una columna char(16) estaría bien para guardar datos binarios UUID.

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