在MySQL 8中,数据库表`mysql`.`proc`不存在。以前,我使用此表删除/删除/清除所有存储过程,并从源版本控制代码重新创建它们。这样可以很好地确保开发存储过程在投入生产之前已保存到源版本控制中。
在8之前的MySQL版本中,此SQL查询有效。
从mysql`.proc删除,其中type =程序PROCEDURE和db test;测试
是否有另一种方法可以在一条语句中获得查询结果?
答案 0 :(得分:0)
尝试
delete from mysql.proc WHERE db LIKE <yourDbName>;
答案 1 :(得分:0)
在MySQL 8.0中,可通过Routines的INFORMATION_SCHEMA
表访问存储过程(例程)的详细信息。以下几点值得注意:
ROUTINES表提供有关已存储例程(已存储 程序和存储的功能)。 ROUTINES表不包括 内置的SQL函数或用户定义函数(UDF)。
现在,在此处必须使用常规表中的以下两列:
ROUTINE_SCHEMA
-例程所属的架构(数据库)的名称。
ROUTINE_TYPE
-存储过程为PROCEDURE,存储函数为FUNCTION。
使用SHOW CREATE TABLE information_schema.routines
进行进一步调查后,发现它是临时表
因此,为了删除 test
数据库的所有存储过程(而不是存储函数),我们可以使用以下查询:
DELETE FROM information_schema.routines
WHERE routine_type = 'PROCEDURE' AND
routine_schema = 'test'
答案 2 :(得分:0)
我建议使用MySQL Shell-以下示例使用Python模式:
mysqlsh> \py
mysql-py> i_s = session.get_schema("information_schema")
mysql-py> functions = i_s.ROUTINES \
-> .select("sys.quote_identifier(ROUTINE_SCHEMA) AS RoutineSchema", "sys.quote_identifier(ROUTINE_NAME) AS RoutineName") \
-> .where("ROUTINE_SCHEMA = 'db1' AND ROUTINE_TYPE = 'FUNCTION'").execute().fetch_all()
mysql-py> functions
[
[
"`db1`",
"`func1`"
],
[
"`db1`",
"`func2`"
],
[
"`db1`",
"`func``3`"
]
]
mysql-py> for function in functions:
-> print(sql_fmt.format(*function))
-> session.sql(sql_fmt.format(*function)).execute()
->
DROP FUNCTION `db1`.`func1`
DROP FUNCTION `db1`.`func2`
DROP FUNCTION `db1`.`func``3`
Query OK, 0 rows affected (0.0684 sec)
有关更多讨论,请参见https://mysql.wisborg.dk/2018/12/02/mysql-8-drop-several-stored-events-procedures-or-functions/。
答案 3 :(得分:0)
我认为您的问题的答案是这不可能一次完成。
使用以下语句生成DROP语句列表可能会有所帮助:
SET group_concat_max_len = 4294967295;
SELECT group_concat('DROP PROCEDURE IF EXISTS ', r.routine_name, ';\n' ORDER BY r.routine_name SEPARATOR '') AS DROP_STATEMENTS
FROM information_schema.routines r
WHERE r.routine_schema = database() AND r.routine_type = 'PROCEDURE';