MySQL, vérifiez 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 sinon - créez-la. Sinon ne rien faire. C'est vraiment une procédure facile dans n'importe quelle base de données de classe entreprise, mais MySQL semble être une exception.

Je pensais 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 mal. Est-il possible?

100
demandé sur Gareth Davis 2010-08-03 14:52:29

10 réponses

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;
192
répondu Mfoo 2011-09-01 00:09:15

@ julio

Merci pour L'exemple SQL. J'ai essayé la requête et je pense qu'il a besoin d'une petite modification pour qu'il fonctionne correctement.

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

, ce Qui a fonctionné pour moi.

Merci!

141
répondu Iain 2011-05-10 13:53:17

Voici une autre façon de le faire 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'");
8
répondu wvasconcelos 2012-04-06 16:06:08

Sélectionnez simplement column_name dans le schéma d'informations et placez le résultat de cette requête dans variable. Ensuite, testez la variable pour décider si la table a besoin d'être modifiée ou non.

P.S. ne pas foget pour spécifier TABLE_SCHEMA pour la table de colonnes ainsi.

6
répondu Mchl 2010-08-03 10:55:55

Juste pour aider quiconque cherche un exemple concret de ce que @ Mchi décrivait, essayez quelque chose comme

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

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

6
répondu julio 2011-04-25 22:33:16

J'ai jeté cette procédure stockée avec un début des commentaires de @lain ci-dessus, un peu sympa si vous avez besoin de l'appeler plus de quelques fois (et ne pas avoir besoin de php):

delimiter //
-- ------------------------------------------------------------
-- Use the inforamtion_schema to tell if a field exists.
-- Optional param dbName, defaults to current database
-- ------------------------------------------------------------
CREATE PROCEDURE fieldExists (
OUT _exists BOOLEAN,      -- return value
IN tableName CHAR(255),   -- name of table to look for
IN columnName CHAR(255),  -- name of column to look for
IN dbName CHAR(255)       -- optional specific db
) BEGIN
-- try to lookup db if none provided
SET @_dbName := IF(dbName IS NULL, database(), dbName);

IF CHAR_LENGTH(@_dbName) = 0
THEN -- no specific or current db to check against
  SELECT FALSE INTO _exists;
ELSE -- we have a db to work with
  SELECT IF(count(*) > 0, TRUE, FALSE) INTO _exists
  FROM information_schema.COLUMNS c
  WHERE 
  c.TABLE_SCHEMA    = @_dbName
  AND c.TABLE_NAME  = tableName
  AND c.COLUMN_NAME = columnName;
END IF;
END //
delimiter ;

Travailler avec fieldExists

mysql> call fieldExists(@_exists, 'jos_vm_product', 'child_option', NULL) //
Query OK, 0 rows affected (0.01 sec)

mysql> select @_exists //
+----------+
| @_exists |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

mysql> call fieldExists(@_exists, 'jos_vm_product', 'child_options', 'etrophies') //
Query OK, 0 rows affected (0.01 sec)

mysql> select @_exists //
+----------+
| @_exists |
+----------+
|        1 |
+----------+
5
répondu quickshiftin 2012-05-28 22:10:32

J'utilise ce script simple:

mysql_query("select $column from $table") or mysql_query("alter table $table add $column varchar (20)");

Cela fonctionne si vous êtes déjà connecté à la base de données.

1
répondu vio 2013-03-01 15:55:09

Ne mettez pas ALTER TABLE / MODIFY COLS ou toute autre opération de mod de table dans une TRANSACTION. Les Transactions sont pour pouvoir annuler un échec de requête pas pour ALTERations...it erreur à chaque fois dans une transaction.

Exécutez simplement une requête SELECT * sur la table et vérifiez si la colonne est là...

0
répondu gmize 2013-06-21 16:58:12

Un grand merci à Mfoo qui a mis le script vraiment sympa pour ajouter des colonnes dynamiquement s'il n'existe pas dans la table. j'ai amélioré sa réponse avec PHP. Le script vous aide en outre à trouver le nombre de tables réellement nécessaires 'Add column' mysql comand. Goûtez juste la recette. Fonctionne comme un charme.

<?php
ini_set('max_execution_time', 0);

$host = 'localhost';
$username = 'root';
$password = '';
$database = 'books';

$con = mysqli_connect($host, $username, $password);
if(!$con) { echo "Cannot connect to the database ";die();}
mysqli_select_db($con, $database);
$result=mysqli_query($con, 'show tables');
$tableArray = array();
while($tables = mysqli_fetch_row($result)) 
{
     $tableArray[] = $tables[0];    
}

$already = 0;
$new = 0;
for($rs = 0; $rs < count($tableArray); $rs++)
{
    $exists = FALSE;

    $result = mysqli_query($con, "SHOW COLUMNS FROM ".$tableArray[$rs]." LIKE 'tags'");
    $exists = (mysqli_num_rows($result))?TRUE:FALSE;

    if($exists == FALSE)
    {
        mysqli_query($con, "ALTER TABLE ".$tableArray[$rs]." ADD COLUMN tags VARCHAR(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL");
        ++$new;
        echo '#'.$new.' Table DONE!<br/>';
    }
    else
    {
        ++$already;
        echo '#'.$already.' Field defined alrady!<br/>';    
    }
    echo '<br/>';
}
?>
0
répondu webblover 2014-02-14 18:04:41

Ce travail pour moi avec l'échantillon PDO:

public function GetTableColumn() {      
$query  = $this->db->prepare("SHOW COLUMNS FROM `what_table` LIKE 'what_column'");  
try{            
    $query->execute();                                          
    if($query->fetchColumn()) { return 1; }else{ return 0; }
    }catch(PDOException $e){die($e->getMessage());}     
}
0
répondu user3706926 2015-10-17 14:26:36