MySQL, проверьте, существует ли столбец в таблице с SQL
Я пытаюсь написать запрос, который будет проверять, имеет ли конкретная таблица в MySQL определенный столбец, а если нет - создайте его. Иначе ничего не делай. Это действительно простая процедура в любой базе данных корпоративного класса, но 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;
будет работать, но это плохо удается. Есть ли способ?
10 ответов:
это хорошо работает для меня.
SHOW COLUMNS FROM `table` LIKE 'fieldname';С PHP это было бы что-то вроде...
$result = mysql_query("SHOW COLUMNS FROM `table` LIKE 'fieldname'"); $exists = (mysql_num_rows($result))?TRUE:FALSE;
@julio
Спасибо за пример SQL. Я попробовал запрос, и я думаю, что он нуждается в небольшом изменении, чтобы заставить его работать должным образом.
SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name' AND COLUMN_NAME = 'column_name'это сработало для меня.
спасибо!
Ниже приведен другой способ сделать это с помощью простого 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'");
выберите просто column_name из информационной схемы и поместите результат этого запроса в переменную. Затем проверьте переменную, чтобы решить, нуждается ли таблица в изменении или нет.
P. S. Не забудем указать 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 ;работает с
fieldExistsmysql> 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)");это работает, если вы уже подключены к базе данных.
большое спасибо Mfoo, который поставил действительно хороший скрипт для динамического добавления столбцов, если он не существует в таблице. я улучшил его ответ с PHP. Элемент скрипт дополнительно поможет вам найти, сколько таблиц на самом деле нужно "добавить столбец" mysql comand. Просто попробуйте рецепт. Работает как шарм.
<?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());} }
Comments