2012-01-26 7 views
9

Ho un database MySQL con una tabella (InnoDB) di giochi:Come aggiungere un campo varchar per una tabella già in uso?

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

mi piacerebbe iniziare a generare un valore UUID per ogni riga che posso condividere pubblicamente, qualcosa di simile:

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

select * from gamerooms where id_public = ... 

Come aggiungere questa nuova colonna, tenendo presente che nella tabella sono già presenti record? Sono confuso, perché la colonna deve essere contrassegnato NOT NULL, ma dopo aver aggiunto la colonna, tutti i record che già esistono avrei valori vuoti .. Devo fornire un valore predefinito ?:

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

voglio metti un indice su id_public ovviamente dopo che è stato creato, quindi non è sicuro se i valori nulli dopo che la colonna è stata creata per la prima volta rovinerà tutto.

Inoltre, posso usare varchar (36) con l'output UUID() di mysqls, giusto?

Grazie

+0

Perché contrassegnare la colonna 'NOT NULL' se non è stato assegnato alcun valore significativo per gli articoli esistenti? – Borealid

risposta

21

La tua affermazione è corretta ALTER:

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

Secondo la mia MySQL Pocket Reference, se non si fornisce un valore predefinito per una colonna che viene definita come NOT NULL:

MySQL seleziona un valore in base al tipo di campo

In questo caso, suppongo che il valore predefinito sia una stringa vuota. Una volta che la colonna è stata aggiunta, è sufficiente creare un nuovo indice per la colonna, e ricostruire l'indice utilizzando un nulla alterazione istruzioni in questo modo:

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

si può essere in grado di creare l'indice allo stesso tempo che si fare l'inserto. Il mio MySQL-fu non è abbastanza forte per sapere come farlo.

1

I record esistenti hanno un valore una volta creata questa nuova colonna? Se sì, puoi farlo in più passaggi. Innanzitutto, crea la nuova colonna senza vincoli o indici, quindi torna a popolarla con l'UUID per tutti i record esistenti. Una volta che tutto è popolato, aggiungi il vincolo non nullo e i tuoi indici.

0

Poiché un UUID è un numero a 128 bit, non è necessario una colonna varchar per memorizzarlo. una colonna char(16) sarebbe ok per salvare un dato binario UUID.

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