是否有一种语句可以删除MySQL中所有的存储过程? 如果第一个不可行,那么MySQL中是否有临时存储过程这样的东西?类似于临时表。
是否有一种语句可以删除MySQL中所有的存储过程? 如果第一个不可行,那么MySQL中是否有临时存储过程这样的东西?类似于临时表。
我本以为这样可以做到,但我愿意接受更正:
(编辑以整合评论中提供的好建议)
delete from mysql.proc WHERE db LIKE <yourDbName>;
(正如下面评论中Balmipour所指出的那样,指定数据库是个好主意。)
我认为想要删除给定数据库中的所有过程是有效的,否则在长时间的开发周期中,会存在废弃的过程和函数堆积,使得一切变得混乱。
mysql.proc
在MySQL 5.7中是否仍然是与元信息交互的可行方法?这个命令似乎比读取information_schema.ROUTINES
并生成动态SQL命令更方便。 - ebyrobSELECT * FROM mysql.proc WHERE db LIKE 'yourDbName';
- Manatax由于DROP PROCEDURE和DROP FUNCTION不允许子查询,我认为通过另一个存储过程执行操作可能是可行的,但遗憾的是,MySQL不允许存储过程删除其他存储过程。
我试图通过创建预处理语句来欺骗MySQL并从存储过程中分离出删除调用,但是我没有成功。
因此,我的唯一贡献就是这个选择语句,它创建了一个语句列表,以删除所有存储过程和函数。
SELECT
CONCAT('DROP ',ROUTINE_TYPE,' `',ROUTINE_SCHEMA,'`.`',ROUTINE_NAME,'`;') as stmt
FROM information_schema.ROUTINES;
这似乎会删除这些程序...不过我不确定会有什么影响
DELETE FROM mysql.proc WHERE db = 'Test' AND type = 'PROCEDURE';
我几乎可以让一段代码工作起来来删除所有存储过程,但是我认为MySQL不允许我在存储过程之外使用LOOP或CURSOR。
我可以编写一个SQL文件来计算给定模式的存储过程数量,并且我有迭代表格并删除过程的代码,但我无法使其运行:
SELECT COUNT(ROUTINE_NAME)
INTO @remaining
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = SCHEMA()
AND ROUTINE_TYPE = 'FUNCTION';
kill_loop: LOOP
IF @remaining < 1 THEN
LEAVE kill_loop;
END IF;
SELECT ROUTINE_NAME
INTO @cur_func_name
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = SCHEMA()
AND ROUTINE_TYPE = 'FUNCTION'
LIMIT 1;
DROP FUNCTION @cur_func_name;
@remaining = @remaining - 1;
END LOOP;
SET group_concat_max_len = 4096;
SELECT GROUP_CONCAT(Procedures SEPARATOR '; ') From (SELECT CONCAT(
"DROP PROCEDURE IF EXISTS `",SPECIFIC_NAME, '`') AS Procedures
FROM information_schema.ROUTINES R WHERE R.ROUTINE_TYPE = "PROCEDURE"
AND R.ROUTINE_SCHEMA = 'my_database_name') As CopyThis;
在创建存储过程和函数的语句列表后,您可以避免手动复制粘贴列出的查询,方法如下:
mysql>SELECT
CONCAT('DROP ',ROUTINE_TYPE,' `',ROUTINE_SCHEMA,'`.`',ROUTINE_NAME,'`;') as stmt
FROM information_schema.ROUTINES into outfile '/tmp/a.txt';
mysql> source /tmp/a.txt;
@user1070300的回答似乎可以工作,但看起来它会删除很多东西。
快速执行DESC mysql.proc;
让我添加了WHERE到我的请求中,以避免删除已经存在的MySQL存储过程,这当然是不必要的。
我执行了DELETE FROM mysql.proc WHERE db NOT LIKE 'mysql'
;
如果您有多个数据库并且只想针对其中一个,请改用DELETE FROM mysql.proc WHERE db LIKE '<yourDbName>'
;
顺便说一句,如果像我一样,您正在完全清除数据库并且需要同时删除表格,您可以使用此Linux Shell脚本:
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done
(请参见在一个命令中截断MySQL数据库中的所有表了解更多详情)
where
语句!(我很高兴答案被编辑以考虑到这一点) - Balmipour