changer le type d'une colonne: quelle est la bonne solution?

Forum du cours Conception et Administration de bases de données

Modérateur : Wattiau Isabelle

ploum
Messages : 6
Inscription : 04 déc. 2006 12:59

changer le type d'une colonne: quelle est la bonne solution?

Message par ploum » 06 déc. 2006 16:58

bonjour,

petite question : pour changer le type d'une colonne dans une table il faut bien sûr qu'elle soit vide.
je me demandais quelle solution était la plus performante :


1- créer une table temporaire (2) avec la nouvelle colonne modifiée
2- insérer les données de l'ancienne table (1) vers la table temporaire (2)
3- supprimer la table (1) -est ce que l'action est atomique?
4- renommer la table (2) en "nome de la table (1)

OU

1,2 identique
3- vider le contenu de la table (1) (truncate)
4- changer le type de la colonne à modifier
5- insérer les données de la table (2) dans la table (1)


le mieux est je pense, mettre le tout dans un procédure pour des question s de mise à jour, non ?

merci pour vos réponses

ploum

Cyberfreak
Messages : 8
Inscription : 10 oct. 2006 8:46
Localisation : Paris

Message par Cyberfreak » 10 déc. 2006 17:59

Je ne sais pas, mais la reponse m'interesse aussi ;)

LIT016
Messages : 2
Inscription : 16 déc. 2006 18:18

Message par LIT016 » 16 déc. 2006 18:33

salut,

Pour la reponse a ta question, t'as pas besoin de vider ta table :lol: . Utilise la commande ALTER TABLE 'nom de ta table' MODIFY 'colone' puis le NOUVEAU TYPE.

Il est possible d'augmenter la taille d'une colonne numerique ou d'une chaine de caractere ou de la diminuer si toutes les données présentes dans la colonnes peuvent s'adapter à la nouvelle taille. :wink:

Bye

Cyberfreak
Messages : 8
Inscription : 10 oct. 2006 8:46
Localisation : Paris

Message par Cyberfreak » 18 déc. 2006 9:17

Bin oui, mais prenons le cas simple et idiot du TP ou tu as, de tete, un champ integer que tu veux passer en string...

LIT016
Messages : 2
Inscription : 16 déc. 2006 18:18

Message par LIT016 » 19 déc. 2006 16:39

J'opte pour la deuxieme solution tout en oubliant pas de suprimer la table 1 a la fin de l'operation :?

SQLpro
Messages : 1
Inscription : 26 déc. 2006 20:23
Localisation : PACA & RP
Contact :

Message par SQLpro » 26 déc. 2006 20:30

Bonjour,

Le langage SQL n'a expréssement pas prévu qu'une colonne puisse être modifié et cela pour des raisons d'intégrité de la base.
En effet, que se passerait-il si cette colonne est utilisée dans une vue, une procédure stockée, un trigger, une intégrité référentielle...

Voici ce que je dis dans mon livre SQL (synthex) :
Malgré que SQL n'est pas prévu la possibilité de modifier directement le type ou le nom d'une colonne, on peut utiliser un script SQL transactionnel en plusieurs étapes pour y parvenir.
Partant de la structure de table suivante :
CREATE TABLE T_UTILISATEUR_USR
(USR_NOM CHAR(32) NOT NULL,
USR_PRENOM VARCHAR(16) NOT NULL,
USR_MAIL VARCHAR(256) NOT NULL,
USR_ORG VARCHAR(128),
CONSTRAINT PK_USR_NOMPRE PRIMARY KEY (USR_NOM, USR_PRENOM),
CONSTRAINT UK_USR_MAIL UNIQUE (USR_MAIL),
CONSTRAINT UK_USR_NOMORG UNIQUE (USR_NOM, USR_ORG))

Voici un exemple de script SQL qui convertit les colonnes nom et prénom en une seule colonne et en profite pour changer le nom de la colonne :

ALTER TABLE T_UTILISATEUR_USR
ADD tmp_usr_nompre CHAR(48)

UPDATE T_UTILISATEUR_USR
SET tmp_usr_nompre = USR_NOM || USR_PRENOM

ALTER TABLE T_UTILISATEUR_USR
DROP CONSTRAINT PK_USR_NOMPRE

ALTER TABLE T_UTILISATEUR_USR
DROP CONSTRAINT UK_USR_NOMORG

ALTER TABLE T_UTILISATEUR_USR
DROP COLUMN USR_NOM

ALTER TABLE T_UTILISATEUR_USR
DROP COLUMN USR_PRENOM

ALTER TABLE T_UTILISATEUR_USR
ADD USR_NOM_PRENOM VARCHAR(64) NOT NULL DEFAULT ''

UPDATE T_UTILISATEUR_USR
SET USR_NOM_PRENOM = tmp_usr_nompre

ALTER TABLE T_UTILISATEUR_USR
ADD CONSTRAINT PK_USR_NOMPRE PRIMARY KEY (USR_NOM_PRENOM)

ALTER TABLE T_UTILISATEUR_USR
DROP COLUMN tmp_usr_nompre

On conçoit facilement qu'il est préférable d'utiliser un outil de modélisation de données capable d'automatiser de tels script SQL de modification de table.
Une pseudo comamnde "ALTER TABLE ... MODIFY" n'existe pas dans la norme SQL, pas plus qu'une procédure du genre "sp_rename". Attention a ce que font ce genre de pseudo commandes...
En fait la plupart du temps ces commandes suppriment la table pour la reconstruire en ayant préalabelemnt sauvegardé les données, débranché les contraintes et tout cela dans une transaction au niveau SERIALIZABLE...

Imaginez ce qui se passe si vous lancez cela en production avec une base contenant un fort volume de données...

A +

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité