是否有可以刪除MySQL中所有存儲過程的語句? 另外(如果第一個是不可能的),是否有這樣的事情在MySQL臨時存儲過程?類似於臨時表的東西?刪除MySQL中的所有存儲過程或使用臨時存儲過程
回答
由於DROP PROCEDURE和DROP FUNCTION不允許子選擇,我想這可能是可能通過另一個存儲過程來執行操作,但很可惜,MySQL不允許存儲過程將其他存儲過程。
無論如何我嘗試了通過創建準備好的語句,因而從存儲過程有些分離掉話欺騙MySQL來此,但我有沒有運氣。
因此,因此我唯一的貢獻是創造刪除所有存儲過程和函數所需的語句列表SELECT語句。
SELECT
CONCAT('DROP ',ROUTINE_TYPE,' `',ROUTINE_SCHEMA,'`.`',ROUTINE_NAME,'`;') as stmt
FROM information_schema.ROUTINES;
這將爲所有可用的數據庫模式創建刪除功能。謹慎使用! – Dasun 2013-06-07 16:34:57
我可以幾乎獲得工作的一段代碼刪除所有存儲的特效,但我認爲MySQL是不是讓我使用循環或存儲過程之外的光標。
我可以寫計數第一個給定的模式存儲程序的數量一個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;
感謝這將幫助未來用戶的想法!我不確定這個問題在光標/循環上應該如何解決...... – 2010-11-14 04:11:58
@Kenston:我最終編寫了一個輸出SQL的MySQL腳本,它將刪除特效 - 所以輸出可以傳回到mysql。 – phyzome 2011-01-10 02:20:56
太棒了!感謝您的跟進! – 2011-01-17 15:27:49
我本來以爲,這將做到這一點,但我願意更正:
(編輯以合併的意見提供了很好的點)
delete from mysql.proc WHERE db LIKE <yourDbName>;
(正如指出OUT b y Balmipour在下面的評論中,這是一個好主意,指定數據庫)
我認爲它是有效的要刪除給定的數據庫中的所有程序,否則在一個長的開發週期中存在過時的程序和功能的危險積聚和混淆一切。
適合我!實施起來更簡單! :) – 2014-04-05 03:22:16
@ user1070300我擔心這會破壞所有程序,**包括與您的數據庫無關的MySQL的**,以及所有基地的程序,如果您的服務器上有多個程序。請考慮在此請求中添加「WHERE db LIKE
@Balmipour一個很好的觀點,儘管它不再回答原始請求,這是一個可以刪除MySQL中的所有存儲過程的語句。 – user1070300 2016-04-09 09:48:22
在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;
感謝你的想法,儘管這應該已經作爲評論到被接受的答案。我實際上使用Java來運行它,但這對其他人仍然有用。 – 2012-04-11 11:29:14
人們忽視評論包括我,他們也不是很明顯。 – 2013-09-02 05:17:16
這似乎是下降的程序......不知道,雖然
DELETE FROM mysql.proc WHERE db = 'Test' AND type = 'PROCEDURE';
@ 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?瞭解詳細信息)
我使用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;
- 1. 在MySQL中存儲過程結束時刪除臨時表
- 2. 刪除和重新使用存儲過程中的臨時表
- 3. 刪除或存儲過程中的PostgreSQL
- 4. 使用存儲過程刪除臨時表
- 5. 存儲過程中的臨時表
- 6. 使用Fluent刪除存儲過程nHibernate
- 7. Fluent NHibernate - 使用存儲過程刪除
- 8. 何時在存儲過程中使用CTE在存儲過程
- 9. 從存儲過程中調用存儲過程在MySQL中
- 10. 存儲過程中的MySQL臨時與內存表
- 11. 私有MySql存儲過程
- 12. MySQL存儲過程
- 13. MySQL存儲過程
- 14. MySQl存儲過程
- 15. Mysql存儲過程
- 16. 存儲過程mysql
- 17. MYSQL - 存儲過程
- 18. 使用MySQL中的存儲過程刪除數據
- 19. JPA JPQl或MySQL中的存儲過程
- 20. 臨時和永久存儲過程
- 21. 臨時表和存儲過程編譯
- 22. 臨時存儲過程範圍
- 23. 存儲過程臨時表與參數
- 24. 存儲過程和臨時表
- 25. MySQL存儲過程重用?
- 26. 通用MySQL存儲過程
- 27. 刪除特定SQL Server架構中的所有存儲過程
- 28. Oracle存儲過程刪除用戶
- 29. 在存儲過程中刪除SQL Server
- 30. 打破存儲過程中串入臨時表中的MySQL
嗨,雖然這聽起來很可笑:)),但它的東西,我從MS SQL服務器借用(http://msdn.microsoft.com/en-us/library/aa174792(SQL.80).aspx)其中說「SQL Server 2000還支持臨時存儲過程,就像臨時表一樣,當您斷開連接時,它們會自動刪除。」但是我的目的是在會話結束後將所有內容都刪除,儘管我仍然有備份計劃,比如使用語言循環存儲過程名稱並逐個刪除它們(沒有檢查是否可能)。 – 2010-06-12 08:07:29
@ebyrob - 你說得很對。 MySQL不支持程序代碼的匿名塊。我的意見反映Oracle數據庫管理系統無效轉移,它確實允許執行任意程序代碼而不定義永久存儲過程。 – APC 2017-01-31 17:50:28