Eu estou tentando escrever uma consulta que verifique se uma tabela específica no MySQL tem uma coluna específica e, se não - crie-a. Caso contrário, não faça nada. Este é realmente um procedimento fácil em qualquer banco de dados de classe empresarial, mas o MySQL parece ser uma exceção.
Eu pensei algo como
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;
funcionaria, mas falha muito. Há algum jeito?
Respostas:
Isto funciona bem para mim.
Com o PHP seria algo como ...
fonte
@julio
Obrigado pelo exemplo SQL. Tentei a consulta e acho que precisa de uma pequena alteração para fazê-la funcionar corretamente.
Isso funcionou para mim.
Obrigado!
fonte
IF
etc. Consulte stackoverflow.com/questions/7384711/… para obter um exemplo de como agrupar um procedimento o teste para a coluna e a instrução DML condicional.Apenas para ajudar quem está procurando um exemplo concreto do que o @Mchl estava descrevendo, tente algo como
SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
Se retornar falso (zero resultado), você saberá que a coluna não existe.
fonte
TABLE_NAME = 'my_table'
, TABLE_SCHEMA é o esquema da tabela é no IE.SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
A seguir, é outra maneira de fazer isso usando PHP simples, sem o banco de dados information_schema:
fonte
isset()
trow 'false' se a chave da matriz existir, mas o valor for NULL . É melhor usararray_key_exists()
comoif( !array_key_exists( 'my_new_column', $mycol ) )
isset()
verificação simples . Não resolve a questão, mas é melhor se você já precisar executar a consulta de seleção e ter o resultado na memória.Joguei esse procedimento armazenado junto com os comentários de @ lain acima, um pouco legal se você precisar chamá-lo mais do que algumas vezes (e não precisar de php):
Trabalhando com
fieldExists
fonte
ExpirationDate
campo. JeanSelecione apenas column_name no esquema de informações e coloque o resultado dessa consulta na variável Em seguida, teste a variável para decidir se a tabela precisa de alteração ou não.
PS Não se esqueça de especificar também a tabela TABLE_SCHEMA para COLUMNS.
fonte
Eu estou usando este script simples:
Funciona se você já estiver conectado ao banco de dados.
fonte
Muito obrigado ao Mfoo, que colocou o script muito bom para adicionar colunas dinamicamente, se não existir na tabela. Eu melhorei sua resposta com PHP . O roteiro também ajuda a encontrar quantas tabelas realmente necessário 'Add coluna' comand mysql. Basta provar a receita. Funciona como charme.
fonte
Este trabalho para mim com amostra DOP:
fonte
NÃO coloque ALTER TABLE / MODIFY COLS ou quaisquer outras operações de modificação de tabela dentro de uma TRANSACTION. As transações destinam-se a reverter uma falha de QUERY, não para ALTERations ... ela ocorrerá sempre de erro em uma transação.
Basta executar uma consulta SELECT * na tabela e verificar se a coluna está lá ...
fonte
ALTER
(e DDL assim) no MySQL de fato confirmam (implicitamente) a transação. Mas o uso de SELECT * geraria uma grande sobrecarga na rede para apenas verificar a existência da coluna. Você pode tentarSELECT my_col_to_check FROM t LIMIT 0
: se o mysql gerar um erro, provavelmente a coluna não existe (ainda assim, verifique o erro, pois pode ser um problema de rede ou o que seja!); se não gerar erro, a coluna existe. Não sei se é a melhor maneira de verificar a existência de colunas.