删除MySQL中的所有存储过程或使用临时存储过程

Drop all stored procedures in MySQL or using temporary stored procedures

是否有一个声明可以删除MySQL中的所有存储过程?
或者(如果第一个不可能),MySQL中是否存在临时存储过程? 类似于临时表的东西?


我本以为会这样做,但我愿意改正:

(已编辑以包含评论中提供的优点)

1
delete from mysql.proc WHERE db LIKE <yourDbName>;

(正如Balmipour在下面的评论中指出的那样,指定数据库是个好主意。)

我认为想要删除给定数据库中的所有过程是有效的,否则在漫长的开发周期中存在过时的过程和函数累积并使所有事情变得混乱的危险。


由于DROP PROCEDURE和DROP FUNCTION不允许子选择,我认为可能通过另一个存储过程执行操作,但唉,MySQL不允许存储过程丢弃其他存储过程。

无论如何,我试图通过创建预准备语句来欺骗MySQL,从而将drop调用与存储过程分开,但我没有运气。

因此,我唯一的贡献是这个select语句,它创建了删除所有存储过程和函数所需的语句列表。

1
2
3
SELECT
    CONCAT('DROP ',ROUTINE_TYPE,' `',ROUTINE_SCHEMA,'`.`',ROUTINE_NAME,'`;') as stmt
FROM information_schema.ROUTINES;


这似乎放弃了程序......但不确定其含义

1
DELETE FROM mysql.proc WHERE db = 'Test' AND type = 'PROCEDURE';


我几乎可以使用一段代码来删除所有存储过程,但我认为MySQL不允许我在存储过程之外使用LOOP或CURSOR。

我可以编写一个SQL文件来计算给定模式的存储过程的数量,我有代码来遍历表并删除过程,但是我无法运行它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;


我使用select语句显示一个单元格中特定数据库的所有Drop Procedure语句。然后将其复制到查询窗口。

1
2
3
4
5
6
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;

在select语句之后创建了删除所有存储过程和函数所需的语句列表。您可以避免手动复制粘贴列出的查询,如下所示:

1
2
3
4
5
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 '';

顺便说一句,如果像我一样,你完全清理你的数据库,还需要删除你的表,你可以使用这个linux shell脚本:
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e"drop table $table" DATABASE_NAME; done
(有关详细信息,请参阅在一个命令中截断MySQL数据库中的所有表?)

在一个命令中截断MySQL数据库中的所有表?