J'essaye d'écrire une requête qui vérifiera si une table spécifique dans MySQL a une colonne spécifique, et sinon - la crée. Sinon, ne faites rien. C'est vraiment une procédure simple dans n'importe quelle base de données d'entreprise, mais MySQL semble être une exception.
J'ai pensé à 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 cela échoue gravement. Y a-t-il un moyen?
Réponses:
Cela fonctionne bien pour moi.
Avec PHP, ce serait quelque chose comme ...
la source
@julio
Merci pour l'exemple SQL. J'ai essayé la requête et je pense qu'elle a besoin d'une petite modification pour qu'elle fonctionne correctement.
Cela a fonctionné pour moi.
Merci!
la source
IF
, etc. Voir stackoverflow.com/questions/7384711/... un exemple de la façon d'envelopper une procédure autour de le test de la colonne et l'instruction DML conditionnelle.Juste pour aider tous ceux qui recherchent un exemple concret de ce que @Mchl décrivait, 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 (aucun résultat), vous savez que la colonne n'existe pas.
la source
TABLE_NAME = 'my_table'
, TABLE_SCHEMA est le schéma dans lequel se trouve la table. IeSELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
Voici une autre façon de le faire en utilisant PHP simple sans la base de données information_schema:
la source
isset()
trow 'false' si la clé de tableau existe mais la valeur est NULL . Il vaut mieux utiliserarray_key_exists()
commeif( !array_key_exists( 'my_new_column', $mycol ) )
isset()
chèque. Cela ne résout pas la question, mais il est préférable que vous ayez déjà besoin d'exécuter la requête de sélection et d'avoir le résultat en mémoire.J'ai jeté cette procédure stockée avec un début des commentaires de @ lain ci-dessus, plutôt sympa si vous devez l'appeler plusieurs fois (et ne pas avoir besoin de php):
Travailler avec
fieldExists
la source
ExpirationDate
champ. 😊Sélectionnez simplement nom_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.
PS Ne vous inquiétez pas de spécifier TABLE_SCHEMA pour la table COLUMNS également.
la source
J'utilise ce script simple:
Cela fonctionne si vous êtes déjà connecté à la base de données.
la source
Un grand merci à Mfoo qui a mis le très beau script 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 également à trouver le nombre de tables réellement nécessaires à la commande mysql «Ajouter une colonne» . Goûtez simplement la recette. Fonctionne comme du charme.
la source
Ce travail pour moi avec un échantillon AOP:
la source
NE PAS mettre ALTER TABLE / MODIFY COLS ou toute autre opération de modification de table dans une TRANSACTION. Les transactions sont pour pouvoir annuler un échec de QUERY et non pour des ALTERations ... cela entraînera une erreur à chaque fois dans une transaction.
Exécutez simplement une requête SELECT * sur la table et vérifiez si la colonne est là ...
la source
ALTER
(et DDL comme ça) dans MySQL valide en effet (implicitement) la transaction. Mais l'utilisation de SELECT * générerait une surcharge importante dans le réseau pour simplement vérifier l'existence de la colonne. Vous pouvez plutôt essayerSELECT my_col_to_check FROM t LIMIT 0
: si mysql génère une erreur, alors la colonne n'existe probablement pas (vérifiez quand même l'erreur, car il peut s'agir d'un problème de réseau ou autre!); s'il ne génère aucune erreur, la colonne existe. Je ne suis pas sûr que ce soit le meilleur moyen de vérifier l'existence d'une colonne.