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

时间:2010-06-12 07:07:23

标签: mysql stored-procedures

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

7 个答案:

答案 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?

Truncate all tables in a MySQL database in one command?