是否有可以删除MySQL中所有存储过程的语句? 或者(如果第一个不可能),MySQL中是否存在临时存储过程?类似于临时表的东西?
答案 0 :(得分:23)
我本以为会这样做,但我愿意改正:
(已编辑以包含评论中提供的优点)
delete from mysql.proc WHERE db LIKE <yourDbName>;
(正如Balmipour在下面的评论中指出的那样,指定数据库是个好主意。)
我认为想要删除给定数据库中的所有过程是有效的,否则在很长的开发周期中,存在过时的过程和函数累积并使所有过程变得混乱的危险。
答案 1 :(得分:21)
由于DROP PROCEDURE和DROP FUNCTION不允许子选择,我认为可以通过另一个存储过程执行操作,但是,MySQL不允许存储过程丢弃其他存储过程。
我试图通过创建预准备语句来欺骗MySQL,从而将drop调用与存储过程分开,但我没有运气。
因此,我唯一的贡献就是这个select语句,它创建了一个删除所有存储过程和函数所需语句的列表。
SELECT
CONCAT('DROP ',ROUTINE_TYPE,' `',ROUTINE_SCHEMA,'`.`',ROUTINE_NAME,'`;') as stmt
FROM information_schema.ROUTINES;
答案 2 :(得分:9)
这似乎放弃了程序......但不确定其含义
DELETE FROM mysql.proc WHERE db = 'Test' AND type = 'PROCEDURE';
答案 3 :(得分:3)
我可以几乎使用一段代码来删除所有存储过程,但我认为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;
答案 4 :(得分:1)
在select语句之后,它创建了删除所有存储过程和函数所需的语句列表。您可以避免手动复制粘贴列出的查询,如下所示:
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;
答案 5 :(得分:1)
我使用select语句显示一个单元格中特定数据库的所有Drop Procedure语句。然后将其复制到查询窗口。
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;
答案 6 :(得分:0)
@ 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
(有关详细信息,请参阅Truncate all tables in a MySQL database in one command?)