如何在 phpMyAdmin 中运行命令,该命令将删除数据库中具有前缀的所有列test_
。
4 回答
要从表中删除列,请使用以下语法:
alter table <tablename> drop column <columnname>
要查找数据库中以 test_ 开头的表中的所有列,请执行以下操作:
select column_name
from INFORMATION_SCHEMA.columns
where table_name = <table_name> and
table_schema = <schema_name> and
left(column_name, 5) = 'test_' -- not using "like" because '_' is a wildcard char
如果您手动执行此操作,我建议您运行以下查询,然后将结果粘贴到 mysql 查询界面:
select concat('alter table ', table_name, ' drop column ', column_name)
from INFORMATION_SCHEMA.columns
where table_name = <table_name> and
schema_name = <schema_name> and
left(column_name, 5) = 'test_'
您可以在代码中执行类似的操作,方法是运行查询、返回结果,然后将每一行作为查询运行。
如果你真的想从你的模式中删除列,你需要从 MySQL 的信息模式表中动态生成必要的 SQL 命令。虽然可以在 MySQL 存储过程中使用SQL Prepared statements来做到这一点,我将在下面演示,但您可能会发现用您喜欢的开发语言(您在问题中没有提到)更容易实现/理解:
DELIMITER ;;
CREATE PROCEDURE dropMatchingColumns(IN pattern VARCHAR(64))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR
SELECT CONCAT(
'ALTER TABLE `', REPLACE( TABLE_NAME, '`', '``'), '` ',
GROUP_CONCAT(
'DROP COLUMN `', REPLACE(COLUMN_NAME, '`', '``'), '`'
)
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE pattern AND TABLE_SCHEMA = DATABASE()
GROUP BY TABLE_NAME
;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO @sql;
IF done THEN
LEAVE read_loop;
END IF;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
END;;
DELIMITER ;
定义此过程后,只需从当前数据库CALL dropMatchingColumns('test\_%');
中删除所有前缀为 的列。test_
如果您有 MySQl Workbench,那么您可以通过简单地进行批量选择并告诉工作台批量删除选定的列来删除多个列
我想为像我这样遇到问题的人解释或简化这个答案。
在我的数据库“演示”的所有表中删除名为“seq”的列时遇到问题。
您可以使用为每个表设置格式的命令创建选择,如下所示:
Select concat('alter table ', table_name, ' drop column ', 'seq;')
from (select table_name
from INFORMATION_SCHEMA.tables
where table_name = table_name and
table_schema = 'demo') as t
这将为“演示”数据库中的每个表创建 alter table 命令。
您必须选择结果,复制它,然后将其粘贴回查询编辑器。
这是一个两步过程,但如果您必须多次执行此操作,请将命令保存在文本文件中以便稍后再次运行。