我正在尝试编写一个查询,以检查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;
Run Code Online (Sandbox Code Playgroud)
会工作,但它失败了.有办法吗?
Mfo*_*foo 236
这对我很有用.
SHOW COLUMNS FROM `table` LIKE 'fieldname';
Run Code Online (Sandbox Code Playgroud)
使用PHP,它会像...
$result = mysql_query("SHOW COLUMNS FROM `table` LIKE 'fieldname'");
$exists = (mysql_num_rows($result))?TRUE:FALSE;
Run Code Online (Sandbox Code Playgroud)
小智 149
@julio
感谢SQL示例.我尝试了查询,我认为需要进行一些小改动才能使其正常工作.
SELECT *
FROM information_schema.COLUMNS
WHERE
TABLE_SCHEMA = 'db_name'
AND TABLE_NAME = 'table_name'
AND COLUMN_NAME = 'column_name'
Run Code Online (Sandbox Code Playgroud)
这对我有用.
谢谢!
jul*_*lio 13
只是为了帮助那些正在寻找@Mchl描述的具体例子的人,试试类似的东西
SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_table' AND COLUMN_NAME = 'my_column'
如果它返回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'");
Run Code Online (Sandbox Code Playgroud)
我把这个存储过程与上面@ 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 ;
Run Code Online (Sandbox Code Playgroud)
与...合作 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 |
+----------+
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
196970 次 |
最近记录: |