MySQL,用SQL检查一个表是否存在于一个表中

我正在尝试编写一个查询来检查MySQL中的特定表是否有特定的列,如果没有 – 创build它。 否则什么都不要做 这在任何企业级数据库中都是一个简单的过程,但MySQL似乎是一个例外。

我以为像这样

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; 

会工作,但是失败了。 有没有办法?

@julio

感谢SQL示例。 我试过查询,我认为它需要一个小改动才能正常工作。

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

这对我有效。

谢谢!

这对我很好。

 SHOW COLUMNS FROM `table` LIKE 'fieldname'; 

用PHP,它会像…

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

以下是使用普通PHP而不使用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'"); 

从信息模式中只selectcolumn_name,然后将此查询的结果放入variables中。 然后testingvariables来决定表是否需要更改。

PS不要为COLUMNS表指定TABLE_SCHEMA。

只是为了帮助任何正在寻找@Mchi描述的具体例子的人,尝试一下类似的东西

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

如果它返回false(零结果),那么你知道该列不存在。

我把这个存储过程放在一起,从@ lain的注释开始,如果你需要调用它几次(而不需要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 ; 

使用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 | +----------+ 

我正在使用这个简单的脚本:

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

它适用于已经连接到数据库的情况。

不要把ALTER TABLE / MODIFY COLS或任何其他这样的表模操作放在TRANSACTION中。 事务是为了能够回滚QUERY故障而不是ALTERATION …它会在事务中每次出错。

只需在表上运行SELECT *查询,并检查列是否存在…

非常感谢Mfoo,如果表中不存在,那么Mfoo已经把dynamic添加列的脚本放在了很好的位置。 我用PHP改进了他的答案 。 该脚本还帮助您find实际需要多less个表“添加列” mysql命令。 只要品尝食谱。 像魅力一样工作。

 <?php ini_set('max_execution_time', 0); $host = 'localhost'; $username = 'root'; $password = ''; $database = 'books'; $con = mysqli_connect($host, $username, $password); if(!$con) { echo "Cannot connect to the database ";die();} mysqli_select_db($con, $database); $result=mysqli_query($con, 'show tables'); $tableArray = array(); while($tables = mysqli_fetch_row($result)) { $tableArray[] = $tables[0]; } $already = 0; $new = 0; for($rs = 0; $rs < count($tableArray); $rs++) { $exists = FALSE; $result = mysqli_query($con, "SHOW COLUMNS FROM ".$tableArray[$rs]." LIKE 'tags'"); $exists = (mysqli_num_rows($result))?TRUE:FALSE; if($exists == FALSE) { mysqli_query($con, "ALTER TABLE ".$tableArray[$rs]." ADD COLUMN tags VARCHAR(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL"); ++$new; echo '#'.$new.' Table DONE!<br/>'; } else { ++$already; echo '#'.$already.' Field defined alrady!<br/>'; } echo '<br/>'; } ?> 

这个工作对于我来说就是PDO示例:

 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());} }