MySQL, controlla se esiste una colonna in una tabella con SQL

Sto cercando di scrivere una query che verificherà se una tabella specifica in MySQL ha una colonna specifica e, in caso contrario, creala. Altrimenti non fare nulla. Questa è davvero una procedura semplice in qualsiasi database di class enterprise, eppure MySQL sembra essere un’eccezione.

Ho pensato qualcosa di simile

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; 

funzionerebbe, ma fallisce male. C’è un modo?

@julio

Grazie per l’esempio SQL. Ho provato la query e penso che sia necessaria una piccola modifica per farlo funzionare correttamente.

 SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name' AND COLUMN_NAME = 'column_name' 

Questo ha funzionato per me.

Grazie!

Questo funziona bene per me.

 SHOW COLUMNS FROM `table` LIKE 'fieldname'; 

Con PHP sarebbe qualcosa come …

 $result = mysql_query("SHOW COLUMNS FROM `table` LIKE 'fieldname'"); $exists = (mysql_num_rows($result))?TRUE:FALSE; 

Di seguito è riportato un altro modo di farlo utilizzando PHP semplice senza il database information_schema:

 $chkcol = mysql_query("SELECT * FROM `my_table_name` LIMIT 1"); $mycol = mysql_fetch_array($chkcol); if(!isset($mycol['my_new_column'])) mysql_query("ALTER TABLE `my_table_name` ADD `my_new_column` BOOL NOT NULL DEFAULT '0'"); 

Seleziona solo column_name dallo schema delle informazioni e metti il ​​risultato di questa query in variabile. Quindi prova la variabile per decidere se la tabella ha bisogno di alterazione o meno.

PS Non impostare il set per specificare TABLE_SCHEMA per la tabella COLUMNS.

Solo per aiutare chiunque stia cercando un esempio concreto di ciò che @Mchi stava descrivendo, prova qualcosa di simile

SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_table' AND COLUMN_NAME = 'my_column'

Se restituisce false (zero risultati), allora sai che la colonna non esiste.

Ho buttato questa stored procedure insieme con un inizio dai commenti di @ lain sopra, un po ‘carino se hai bisogno di chiamarlo più volte (e non avendo bisogno di php):

 delimiter // -- ------------------------------------------------------------ -- Use the inforamtion_schema to tell if a field exists. -- Optional param dbName, defaults to current database -- ------------------------------------------------------------ CREATE PROCEDURE fieldExists ( OUT _exists BOOLEAN, -- return value IN tableName CHAR(255), -- name of table to look for IN columnName CHAR(255), -- name of column to look for IN dbName CHAR(255) -- optional specific db ) BEGIN -- try to lookup db if none provided SET @_dbName := IF(dbName IS NULL, database(), dbName); IF CHAR_LENGTH(@_dbName) = 0 THEN -- no specific or current db to check against SELECT FALSE INTO _exists; ELSE -- we have a db to work with SELECT IF(count(*) > 0, TRUE, FALSE) INTO _exists FROM information_schema.COLUMNS c WHERE c.TABLE_SCHEMA = @_dbName AND c.TABLE_NAME = tableName AND c.COLUMN_NAME = columnName; END IF; END // delimiter ; 

Lavorare con fieldExists

 mysql> call fieldExists(@_exists, 'jos_vm_product', 'child_option', NULL) // Query OK, 0 rows affected (0.01 sec) mysql> select @_exists // +----------+ | @_exists | +----------+ | 0 | +----------+ 1 row in set (0.00 sec) mysql> call fieldExists(@_exists, 'jos_vm_product', 'child_options', 'etrophies') // Query OK, 0 rows affected (0.01 sec) mysql> select @_exists // +----------+ | @_exists | +----------+ | 1 | +----------+ 

Sto usando questo semplice script:

 mysql_query("select $column from $table") or mysql_query("alter table $table add $column varchar (20)"); 

Funziona se sei già connesso al database.

NON mettere ALTER TABLE / MODIFY COLS o qualsiasi altra operazione di mod tabella in una TRANSACTION. Le transazioni sono per essere in grado di ripristinare un errore di QUERY non per ALTERations … verrà eliminato ogni volta in una transazione.

Basta eseguire una query SELECT * sul tavolo e controllare se la colonna è lì …

Mille grazie a Mfoo che ha messo lo script veramente bello per aggiungere colonne dynamicmente se non esiste nella tabella. Ho migliorato la sua risposta con PHP . Lo script inoltre ti aiuta a trovare quante tabelle sono effettivamente necessarie “Aggiungi colonna” mysql comand. Assapora la ricetta. Funziona come un fascino.

 '; } else { ++$already; echo '#'.$already.' Field defined alrady!
'; } echo '
'; } ?>

Questo lavoro per me con PDO di esempio:

 public function GetTableColumn() { $query = $this->db->prepare("SHOW COLUMNS FROM `what_table` LIKE 'what_column'"); try{ $query->execute(); if($query->fetchColumn()) { return 1; }else{ return 0; } }catch(PDOException $e){die($e->getMessage());} }