web-dev-qa-db-fra.com

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

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?

13
zzzzz

MySQL ALTER TABLE n'a pas IF EXISTS spé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:

    SELECT column_name DE INFORMATION_SCHEMA.COLUMNS OERE TABLE_SCHEMA = [Nom de la base de données] ET 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.

7
thatsaru

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);
13
Paroofkey

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;
6
Anto Jose

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;
1
Tejpal Sharma