MySQL: Comment créer une colonne s'il n'existe pas?

13

J'essaie de créer une colonne pour ma table uniquement si elle n'existe pas. J'ai fait beaucoup de recherches mais je n'ai pas encore trouvé de solution.

Est-il vraiment possible de créer une colonne de manière conditionnelle?

zzzzz
la source
Je suis curieux ... Qu'y a-t-il de mal à simplement laisser l'alter échouer en cas d'erreur si la colonne existe déjà?
Derek Downey
En fait, je dois fournir un fichier .sql à mon client qui aurait toutes les requêtes liées aux changements de structure de base de données. Je ne peux pas leur envoyer une base de données entière. Je veux juste leur envoyer des modifications db. il y a beaucoup plus de requêtes dans ce fichier sql. Si cette requête sur la création de colonnes échoue, toutes les requêtes échouent. C'est pourquoi je veux utiliser la condition if pour créer une colonne.
zzzzz
Si votre base de données le prend en charge, vous pouvez utiliser un déclencheur. AVANT D'INSÉRER.
cybernard

Réponses:

7

MySQL ALTER TABLEn'a pas de IF EXISTSspécification.

Vous pouvez effectuer les opérations suivantes en utilisant un proc stocké ou un langage de programmation si c'est quelque chose que vous devrez faire régulièrement:

Pseudocode:

  • Trouvez si la colonne existe en utilisant le SQL ci-dessous:

    CHOISIR À column_name PARTIR DE INFORMATION_SCHEMA. COLUMNS WHERE TABLE_SCHEMA= [Nom de la base de données] AND TABLE_NAME= [Nom de la table];

  • Si la requête ci-dessus renvoie un résultat, cela signifie que la colonne existe, sinon vous pouvez continuer et créer la colonne.

thatsaru
la source
Dans MySQL / MariaDB, j'obtiens une erreur en utilisant cette requête, déclarant qu'elle column_namen'existe pas. J'ai reformulé la requête pour:SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' and column_name='[Column_name]';
Jesus Alonso Abad
2
Pour une réponse simple 0 ou 1 sur MySQL et (je pense) MariaDB:SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' AND column_name='[Column_name]'
piojo
13

Existe actuellement pour Maria DB 10.219

ALTER TABLE test ADD COLUMN IF NOT EXISTS column_a VARCHAR(255);

Bonus, cela fonctionne aussi pour MODIFY

ALTER TABLE test MODIFY IF EXISTS column_a VARCHAR(255);
Paroofkey
la source
3
> "MYSQL 5.5.5"? Ce n'est pas correct, c'est une fonctionnalité de Maria DB uniquement.
Excalibur
1
merci pour la correction
Paroofkey
6

Vous pouvez utiliser cette solution, déjà mentionnée sur une autre publication StackOverFlow: (Réf .: https://stackoverflow.com/a/31989541/ )

MySQL - ALTER TABLE pour ajouter une colonne si elle n'existe pas:

SET @dbname = DATABASE();
SET @tablename = "tableName";
SET @columnname = "colName";
SET @preparedStatement = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (table_name = @tablename)
      AND (table_schema = @dbname)
      AND (column_name = @columnname)
  ) > 0,
  "SELECT 1",
  CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " INT(11);")
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
Anto Jose
la source
2

Cela ci-dessous a fonctionné pour moi:

    SELECT count(*)
    INTO @exist
    FROM information_schema.columns
    WHERE table_schema = 'mydatabase'
    and COLUMN_NAME = 'mycolumn'
    AND table_name = 'mytable' LIMIT 1;

    set @query = IF(@exist <= 0, 'ALTER TABLE mydatabase.`mytable`  ADD COLUMN `mycolumn` MEDIUMTEXT NULL',
    'select \'Column Exists\' status');

    prepare stmt from @query;

    EXECUTE stmt;
Tejpal Sharma
la source
Je suis allé avec celui-ci, merci.
Stuart McIntyre