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?
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;
@ 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!
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'");
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.
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.
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 |
+----------+
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.
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à...
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/>';
}
?>
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());}
}