Forum Clubic

[MySQL] - Conversion de base de données - [RESOLU] - Champ numérique vers ENUM

Voilà j’ai un champ de type TINYINT(1) default4

qui contient 1,2,3,4,5 :slight_smile:

que je veux transformer en ENUM(‘blabla’,‘tralala’,‘fooo’,‘XXX’,‘AZERTY’) NOT NULL default ‘XXX’

Le tout en faisant correspondre 1 à blabla, 2 à tralala et ainsi de suite, dans la mesure où j’ai déjà des données dans cette base.

Quelle est la meilleure façon de faire ?

Transformer mon champ en varchar dans un premier temps, puis changer les 1,2 et autres par leurs équivalents textuels puis convertir le type de champ en enum ?

Et comment faire ca d’ailleurs si c’est effectivement la méthode à employer… :slight_smile:

Merci par avance !

Es-tu sûr de l’invariablité du contenu de ta liste ENUM ?
Si ce n’est pas le cas, tu crées une table annexe{id,lib pk id}
1,‘blabla’
2,’‘tralala’
3,‘fooo’
4,‘XXX’
5,‘AZERTY’
tu gardes les codes déjà présents dans ta table comme foreign key.
Tu pourras même construire une combobox (<select> <option>) par requête pour obliger à saisir un code existant.

C’est invariablement pareil, c’est pour cette raison que j’utilise ENUM. Et c’est l’intérêt de la chose : je n’ai pas à faire de requête pour monter mes combobox, elles sont hardcodées :slight_smile:

Donc ma convertion ?? :smiley:

Hé bien tu fais ton ALTER TABLE pour transformer ton champ en VARCHAR, puis tu te fais une table de concordance :

<?php
//ici ton code de connexion à mysql
$new_vals=array(1=>'blabla',2=>''tralala',3=>'fooo',4=>'XXX',5=>'AZERTY');
foreach($new_vals AS $key=>$value){
      mysql_query("UPDATE tatable  SET  `ton_champ`='$value' WHERE `ton_champ`='$key' ";
      }end foreach
?>

okay, donc j’avais pas totalement faux dans ce que je proposais :slight_smile:

Je te remercie, je vais tester (j’ai fait un backup pour le cas où…) ^^

EDIT : ah merde en revanche ca m’oblige à avoir une page php pour gérer ca… bon ben je testerais que ce soir (pas de FTP au taf… pas pratique pour bosser ca :D) :slight_smile:

T’es obligé de passer par le VARCHAR, car je crains que si tu redéfinis directement le champ en ENUM, tu perdes les valeurs numériques avant d’avoir pu faire l’UPDATE.
Je suis peut-être pessimiste, faudrait tester.

En fait c’est peut-être plus simple que ça, si tu fais ton ALTER TABLE directement en ENUM, il convertit les valeurs vers leur indice dans l’ENUMération

Je vais utiliser le varchar ^^ trop peur de faire des conneries :smiley:

T’as fait un backup, qu’est-ce que tu risques ?

ok j’ai fait ENCORE plus simple :

1/ PASSAGE au Varchar

2/ UPDATE tatable SET ton_champ=’$value’ WHERE ton_champ=’$key’ Je l’ai fait valeur par valeur (j’en avais pas beaucoup)

3/ Modification de la structure de la colonne en ENUM :slight_smile:

Et voilà. spa le plus optimisé, mais ca a fonctionné et pas de perte de données, ce qui est tout de même le plus important ^^

Merci bien de ton assistance !!

Et c’était pas plus simple d’ajouter 1, …, 5 dans l’ENUM
de faire un UPDATE xx SET
truc = CASE truc
WHEN 1 THEN ‘machin’
ELSE ‘bidule’
END CASE

Et de virer les 1…5 de l’ENUM ? :o