Mes recherches et mes expériences n'ont pas encore apporté de réponse, j'espère donc avoir de l'aide.
Je modifie le fichier d'installation d'une application qui dans les versions précédentes n'avait pas de colonne que je souhaite ajouter maintenant. Je ne veux pas ajouter la colonne manuellement, mais dans le fichier d'installation et uniquement si la nouvelle colonne n'existe pas déjà dans le tableau.
La table est créée comme suit:
CREATE TABLE IF NOT EXISTS `#__comm_subscribers` (
`subscriber_id` int(11) NOT NULL auto_increment,
`user_id` int(11) NOT NULL default '0',
`subscriber_name` varchar(64) NOT NULL default '',
`subscriber_surname` varchar(64) NOT NULL default '',
`subscriber_email` varchar(64) NOT NULL default '',
`confirmed` tinyint(1) NOT NULL default '0',
`subscribe_date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`subscriber_id`),
UNIQUE KEY `subscriber_email` (`subscriber_email`)
) ENGINE=MyISAM CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' COMMENT='Subscribers for Comm are stored here.';
Si j'ajoute ce qui suit, sous l'instruction create table, je ne suis pas sûr de ce qui se passe si la colonne existe déjà (et est peut-être remplie):
ALTER TABLE `#__comm_subscribers` ADD `subscriber_surname`;
ALTER TABLE `#__comm_subscribers` MODIFY `subscriber_surname` varchar(64) NOT NULL default '';
Alors, j'ai essayé ce qui suit que j'ai trouvé quelque part. Cela ne semble pas fonctionner mais je ne suis pas tout à fait sûr de l'avoir utilisé correctement.
/*delimiter '//'
CREATE PROCEDURE addcol() BEGIN
IF NOT EXISTS(
SELECT * FROM information_schema.COLUMNS
WHERE COLUMN_NAME='subscriber_surname' AND TABLE_NAME='#__comm_subscribers'
)
THEN
ALTER TABLE `#__comm_subscribers`
ADD COLUMN `subscriber_surname` varchar(64) NOT NULL default '';
END IF;
END;
//
delimiter ';'
CALL addcol();
DROP PROCEDURE addcol;*/
Quelqu'un a-t-il un bon moyen de le faire?
Réponses:
Notez que ce
INFORMATION_SCHEMA
n'est pas pris en charge dans MySQL avant la version 5.0. Les procédures stockées ne sont pas non plus prises en charge avant la version 5.0, donc si vous devez prendre en charge MySQL 4.1, cette solution n'est pas bonne.Une solution utilisée par les frameworks qui utilisent des migrations de bases de données consiste à enregistrer dans votre base de données un numéro de révision pour le schéma. Juste un tableau avec une seule colonne et une seule ligne, avec un entier indiquant quelle révision est en vigueur. Lorsque vous mettez à jour le schéma, incrémentez le nombre.
Une autre solution serait d' essayer simplement la
ALTER TABLE ADD COLUMN
commande. Il devrait générer une erreur si la colonne existe déjà.Attrapez l'erreur et ignorez-la dans votre script de mise à niveau.
la source
--force
commutateur à mysql , ce qui signifie continuer même s'il y a une erreur. alors, allez-y. vous voulez juste être sûr qu'il n'y a aucune instruction que vous ne voulez PAS réussir si quelque chose de précédent a échoué.Voici une solution de travail (juste essayée avec MySQL 5.0 sur Solaris):
À première vue, cela semble probablement plus compliqué qu'il ne le devrait, mais nous devons traiter les problèmes suivants ici:
IF
les instructions ne fonctionnent que dans les procédures stockées, pas lorsqu'elles sont exécutées directement, par exemple dans le client mysqlSHOW COLUMNS
ne fonctionne pas dans la procédure stockée, il faut donc utiliser INFORMATION_SCHEMATABLE_SCHEMA=DATABASE()
.DATABASE()
renvoie le nom de la base de données actuellement sélectionnée.la source
Si vous êtes sur MariaDB, pas besoin d'utiliser des procédures stockées. Utilisez simplement, par exemple:
Vois ici
la source
La plupart des réponses traitent de la façon d'ajouter une colonne en toute sécurité dans une procédure stockée, j'ai eu le besoin d'ajouter une colonne à une table en toute sécurité sans utiliser de proc stocké et j'ai découvert que MySQL ne permettait pas l'utilisation de l'
IF Exists()
extérieur d'un SP . Je publierai ma solution qui pourrait aider quelqu'un dans la même situation.la source
Une autre façon de procéder serait d'ignorer l'erreur avec un
declare continue handler
:Je pense que c'est plus soigné de cette façon qu'avec une
exists
sous-requête. Surtout si vous avez beaucoup de colonnes à ajouter et que vous souhaitez exécuter le script plusieurs fois.plus d'informations sur les gestionnaires de poursuite peuvent être trouvées sur http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html
la source
J'utilise MySQL 5.5.19.
J'aime avoir des scripts que vous pouvez exécuter et réexécuter sans erreur, en particulier là où les avertissements semblent persister, réapparaissant plus tard pendant que j'exécute des scripts sans erreur / avertissement. En ce qui concerne l'ajout de champs, je me suis écrit une procédure pour le rendre un peu moins tapant:
Le code pour créer la procédure addFieldIfNotExists est le suivant:
Je n'ai pas écrit de procédure pour modifier une colonne en toute sécurité, mais je pense que la procédure ci-dessus pourrait être facilement modifiée pour le faire.
la source
J'ai pris le sproc de l'OP et l'ai rendu réutilisable et indépendant du schéma. De toute évidence, cela nécessite toujours MySQL 5.
la source
Je viens d'essayer le script de procédure stockée. Il semble que le problème réside dans les
'
marques autour des délimiteurs. Les documents MySQL montrent que les caractères séparateurs n'ont pas besoin des guillemets simples.Alors tu veux:
Au lieu de:
Travaille pour moi :)
la source
Si vous exécutez ceci dans un script, vous voudrez ajouter la ligne suivante par la suite pour le rendre ré-exécutable, sinon vous obtenez une erreur de procédure déjà existante.
la source
Le meilleur moyen d'ajouter la colonne en PHP> PDO:
Remarque: la colonne du tableau n'est pas répétable, cela signifie que nous n'avons pas besoin de vérifier l'existence d'une colonne, mais pour résoudre le problème, nous vérifions le code ci-dessus:
par exemple si cela fonctionne alerte 1, sinon 0, ce qui signifie que la colonne existe! :)
la source
Vérifier si la colonne existe ou non en PDO (100%)
la source
La procédure de Jake https://stackoverflow.com/a/6476091/6751901 est une solution très simple et bonne pour ajouter de nouvelles colonnes, mais avec une ligne supplémentaire:
vous pouvez y ajouter de nouvelles colonnes plus tard, et cela fonctionnera également la prochaine fois:
la source
Ensuite, dans $ res by cycle, recherchez la clé de votre colonne Smth comme ceci:
la source
SHOW fields FROM __TABLE__NAME__ where field='_my_col_';
, puis vérifier que le jeu de résultats n'est pas videVous trouverez ci-dessous la procédure stockée dans MySQL pour ajouter des colonnes dans différentes tables dans différentes bases de données si la colonne n'existe pas dans une ou plusieurs tables de base de données avec les avantages suivants
la source
la source