MySQL: Como criar uma coluna se não existir?

13

Estou tentando criar uma coluna para minha tabela somente se ela não existir. Pesquisei bastante, mas ainda não encontrei nenhuma solução.

É realmente possível criar uma coluna condicionalmente?

zzzzz
fonte
Estou curioso ... O que há de errado em deixar a alteração falhar se a coluna já existir?
Drek Downey #
Na verdade, preciso fornecer o arquivo .sql ao meu cliente que tenha todas as consultas relacionadas às alterações na estrutura do banco de dados. Não posso enviar todo o banco de dados para eles. Eu só quero enviar-lhes alterações de banco de dados. há muito mais consultas nesse arquivo sql. Se essa consulta sobre a criação de colunas falhar, todas as consultas serão reprovadas. É por isso que eu quero usar a condição if para criar a coluna.
Zzzzz:
Se o seu banco de dados suportar, você poderá usar um gatilho. ANTES DE INSERIR.
precisa saber é o seguinte

Respostas:

7

O MySQL ALTER TABLEnão possui IF EXISTSespecificação.

Você pode fazer o seguinte usando um processo armazenado ou uma linguagem de programação, se isso for algo que você precisará fazer regularmente:

Pseudo-código:

  • Descubra se a coluna existe usando o SQL abaixo:

    SELECIONE column_name DE INFORMATION_SCHEMA. COLUMNS WHERE TABLE_SCHEMA= [Nome do banco de dados] AND TABLE_NAME= [Nome da tabela];

  • Se a consulta acima retornar um resultado, significa que a coluna existe; caso contrário, você poderá prosseguir e criar a coluna.

thatsaru
fonte
No MySQL / MariaDB, recebo um erro ao usar essa consulta, afirmando que column_namenão existe. Reformulei a consulta para:SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' and column_name='[Column_name]';
Jesus Alonso Abad
2
Para um simples 0 ou 1 resposta em ambos MySQL e (eu acho) MariaDB:SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' AND column_name='[Column_name]'
piojo
13

Atualmente existe atualmente para Maria DB 10.219

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

Bônus, funciona também para MODIFY

ALTER TABLE test MODIFY IF EXISTS column_a VARCHAR(255);
Paroofkey
fonte
3
> "MYSQL 5.5.5"? Isso não está correto, é apenas um recurso do Maria DB.
Excalibur
11
Obrigado pela correção
Paroofkey
6

Você pode usar esta solução, já mencionada em outra publicação StackOverFlow: (Ref .: https://stackoverflow.com/a/31989541/ )

MySQL - ALTER TABLE para adicionar uma coluna se ela não existir:

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
fonte
2

Isso abaixo funcionou para mim:

    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
fonte
Eu fui com este, obrigado.
Stuart McIntyre