我正在尝试编写一个查询,检查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;
会起作用,但它失败了。有办法吗?
答案 0 :(得分:210)
这适合我。
SHOW COLUMNS FROM `table` LIKE 'fieldname';
使用PHP就像......
$result = mysql_query("SHOW COLUMNS FROM `table` LIKE 'fieldname'");
$exists = (mysql_num_rows($result))?TRUE:FALSE;
答案 1 :(得分:144)
@julio
感谢SQL示例。我尝试了查询,我认为需要进行一些小改动才能使其正常工作。
SELECT *
FROM information_schema.COLUMNS
WHERE
TABLE_SCHEMA = 'db_name'
AND TABLE_NAME = 'table_name'
AND COLUMN_NAME = 'column_name'
这对我有用。
谢谢!
答案 2 :(得分:8)
只是为了帮助那些正在寻找@Mchl描述的具体例子的人,尝试类似
的内容 SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_table' AND COLUMN_NAME = 'my_column'
如果返回false(零结果),则表示该列不存在。
答案 3 :(得分:8)
以下是使用普通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'");
答案 4 :(得分:7)
我把这个存储过程与@ 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 |
+----------+
答案 5 :(得分:6)
从信息模式中选择column_name,并将此查询的结果放入变量中。然后测试变量以确定表是否需要更改。
P.S。不要忘记为COLUMNS表指定TABLE_SCHEMA。
答案 6 :(得分:1)
我正在使用这个简单的脚本:
mysql_query("select $column from $table") or mysql_query("alter table $table add $column varchar (20)");
如果您已连接到数据库,则它可以正常工作。
答案 7 :(得分:0)
不要在TRANSACTION中放置ALTER TABLE / MODIFY COLS或任何其他此类表格mod操作。事务是为了能够回滚QUERY故障而不是ALTERATION ...它会在事务中每次都出错。
只需在表上运行SELECT *查询并检查列是否存在......
答案 8 :(得分:0)
非常感谢Mfoo,如果表中没有动态列表,那么它就会动态添加非常好的脚本。 我用PHP改进了他的答案。 脚本还可以帮助您查找实际需要多少个表'添加列' 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/>';
}
?>
答案 9 :(得分:0)
这项工作对我来说是样本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());}
}