162 votes

MySQL, Vérifier si une colonne existe dans une table avec SQL

J'essaie d'écrire une requête qui vérifiera si une table spécifique dans MySQL a une colonne spécifique, et si non - la créer. Sinon, elle ne fait rien. Il s'agit d'une procédure très simple dans toute base de données d'entreprise, mais MySQL semble être une exception.

Je pensais que quelque chose comme

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
           WHERE TABLE_NAME='prefix_topic' AND column_name='topic_last_update') 
BEGIN 
ALTER TABLE `prefix_topic` ADD `topic_last_update` DATETIME NOT NULL;
UPDATE `prefix_topic` SET `topic_last_update` = `topic_date_add`;
END;

fonctionnerait, mais il échoue gravement. Existe-t-il un moyen ?

1 votes

0 votes

Pourquoi ne pas simplement le créer ? Si elle existe, la création échouera mais vous ne vous en souciez pas.

0 votes

La création a lieu à l'intérieur d'une transaction et l'échec mettra fin à l'ensemble de la transaction, triste mais vrai.

342voto

Mfoo Points 945

Cela fonctionne bien pour moi.

SHOW COLUMNS FROM `table` LIKE 'fieldname';

Avec PHP, ce serait quelque chose comme...

$result = mysql_query("SHOW COLUMNS FROM `table` LIKE 'fieldname'");
$exists = (mysql_num_rows($result))?TRUE:FALSE;

69 votes

Vous répondez à la question + quelques infos qui m'ont aidé et probablement d'autres, +1

1 votes

@Mfoo Merci Mfoo, vous avez sauvé ma journée ! Ça marche comme sur des roulettes. Une des meilleures solutions à part la création de procédures pour cette tâche.

10 votes

Yura : La réponse purement SQL / MySQL est la première partie où il dit d'utiliser "SHOW COLUMNS FROM table LIKE 'fieldname'". Vous pouvez ignorer le code PHP, c'est juste un exemple d'une façon de récupérer et d'interpréter le résultat si vous utilisez PHP.

178voto

Iain Points 904

@julio

Merci pour l'exemple SQL. J'ai essayé la requête et je pense qu'il faut une petite modification pour qu'elle fonctionne correctement.

SELECT * 
FROM information_schema.COLUMNS 
WHERE 
    TABLE_SCHEMA = 'db_name' 
AND TABLE_NAME = 'table_name' 
AND COLUMN_NAME = 'column_name'

Ça a marché pour moi.

Merci !

0 votes

D'après mes recherches limitées, il semble que tous les environnements d'hébergement ne disposent pas d'une base de données information_schema. Tous les environnements cpanel que j'ai utilisés l'ont. La solution proposée dépend de l'existence de cette base de données.

3 votes

Cette réponse est meilleure que l'utilisation de "SHOW COLUMNS" car elle utilise la méthode standard ANSI pour obtenir des informations sur les tables, contrairement à SHOW COLUMNS qui est spécifique à MySQL. Cette solution fonctionnera donc avec d'autres bases de données. L'utilisation de "information_schema" semble étrange et on pourrait penser que ce n'est pas la façon standard SQL de faire cela, mais c'est le cas.

5 votes

Notez que cette réponse ne vous donne que l'information sur l'existence de la colonne. Si vous souhaitez exécuter de manière conditionnelle certaines instructions DDL, vous devrez envelopper l'ensemble dans une procédure qui permet des instructions telles que IF etc. Voir stackoverflow.com/questions/7384711/ pour un exemple de la manière d'envelopper une procédure autour du test de la colonne et de l'instruction DML conditionnelle.

23voto

julio Points 2017

Pour aider ceux qui recherchent un exemple concret de ce que @Mchl a décrit, essayez quelque chose comme

 SELECT * FROM information_schema.COLUMNS 
 WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' 
 AND COLUMN_NAME = 'my_column'`

Si elle renvoie false (zéro résultat), vous savez que la colonne n'existe pas.

2 votes

Je crois que cela devrait être TABLE_NAME = 'my_table' TABLE_SCHEMA est le schéma dans lequel se trouve la table. C'est-à-dire SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'

10voto

wvasconcelos Points 89

Voici une autre façon de procéder en utilisant PHP sans la base de données information_schema :

$chkcol = mysql_query("SELECT * FROM `my_table_name` LIMIT 1");
$mycol = mysql_fetch_array($chkcol);
if(!isset($mycol['my_new_column']))
  mysql_query("ALTER TABLE `my_table_name` ADD `my_new_column` BOOL NOT NULL DEFAULT '0'");

0 votes

Pourquoi vouloir éviter d'utiliser information_schema ? Il n'existe que dans ce but. (De plus, ce fil est assez ancien et a déjà reçu une réponse).

2 votes

Dans mes tests, cette méthode est environ 10 à 50 fois plus rapide que l'utilisation d'information_schema. Il faut cependant que la table ait au moins une ligne, ce qui n'est pas toujours garanti.

0 votes

isset() affichera 'false' si la clé du tableau existe mais que la valeur est NULL . Il est préférable d'utiliser array_key_exists() comme if( !array_key_exists( 'my_new_column', $mycol ) )

8voto

Mchl Points 32343

Sélectionnez uniquement le nom de la colonne dans le schéma d'information et mettez le résultat de cette requête dans une variable. Testez ensuite la variable pour décider si la table doit être modifiée ou non.

P.S. N'oubliez pas de spécifier TABLE_SCHEMA pour la table COLUMNS également.

1 votes

Je suis plutôt novice en matière de MySQL, pouvez-vous peut-être poster un petit exemple ici ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X