在本教學中,我們將向您展示如何使用MySQL DROP TABLE
語句刪除資料中存在的表。
要刪除現有表,請使用MySQL DROP TABLE
語句。 DROP TABLE
的語法如下:
DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name] ...
[RESTRICT | CASCADE]
DROP TABLE
語句從資料庫中永久刪除一個表及其資料。 在MySQL中,也可以使用單個DROP TABLE
語句刪除多個表,每個表之間用逗號(,
)分隔。
TEMPORARY
標誌指定僅刪除臨時表。用於以確保不會意外刪除非臨時表時非常方便。
IF EXISTS
新增可幫助防止刪除不存在的表。當使用IF EXISTS
新增時,MySQL生成一個」提示資訊」,可以使用SHOW WARNING
語句檢索。 重要的是要注意,當在指定刪除表的列表中存在不存在的表時,DROP TABLE
語句將刪除所有現有表並行出錯誤訊息或「提示資訊」。
如上所述,DROP TABLE
語句僅刪除表及其資料。 但是,它不會刪除與表關聯的特定使用者許可權。 因此,如果在此之後重新建立了具有相同名稱的表,則現有許可權將適用於新錶,這可能會導致安全風險。
RESTRICT
和CASCADE
標誌為未來版本的MySQL保留。最後但並非最不重要的是,必須具有要刪除的表的DROP
許可權。
我們將刪除在使用CREATE TABLE語句建立表教學中建立的tasks
表。 另外,刪除一個不存在的表來練習SHOW WARNING
語句。刪除tasks
表的語句和刪除不存在的表nonexistent_table
,如下:
DROP TABLE IF EXISTS tasks, nonexistent_table;
如果檢視資料庫,將看到tasks
表已被刪除。可以通過使用SHOW WARNING
語句來檢查MySQL由於不存在的表生成的」提示資訊」,如下所示:
SHOW WARNINGS;
執行上面語句,得到以下結果 -
mysql> SHOW WARNINGS;
+-------+------+------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------+
| Note | 1051 | Unknown table 'testdb.nonexistent_table' |
+-------+------+------------------------------------------+
1 row in set
假設有許多表的名稱在資料庫中是以字元test
開始,我們希望通過使用單個DROP TABLE
語句刪除所有這些表以節省時間。 不幸的是,MySQL不提供DROP TABLE LIKE
語句,可以根據以下模式匹配來刪除表:
DROP TABLE LIKE '%pattern%'
但是,有一些解決方法。 我們將在此討論其中一個,以供您參考。為了演示,我們需要建立一些以字串test*
開頭的表。
CREATE TABLE IF NOT EXISTS test1(
id int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE IF NOT EXISTS test2 LIKE test1;
CREATE TABLE IF NOT EXISTS test3 LIKE test1;
CREATE TABLE IF NOT EXISTS test4 LIKE test1;
使用相同的表結構建立了名為:test1
,test2
,test3
和test4
的四個表。假設您想要一次刪除所有字串test*
開頭的表,可以按照以下步驟:
首先,宣告接受資料庫模式的兩個變數和要與表進行匹配的模式:
-- set table schema and pattern matching for tables
SET @schema = 'testdb';
SET @pattern = 'test%';
接下來,需要構建動態DROP TABLE
語句:
-- build dynamic sql (DROP TABLE tbl1, tbl2...;)
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(@schema,'.',table_name)),';')
INTO @droplike
FROM information_schema.tables
WHERE @schema = database()
AND table_name LIKE @pattern;
基本上,查詢指示MySQL轉到information_schema
表,其中包含所有資料庫中所有表的資料,並將與模式@pattern(test%)
匹配的資料庫@schema(testdb)
中的所有表連線到字首DROP TABLE
。GROUP_CONCAT函式建立一個逗號分隔的表列表。
然後,可以顯示動態SQL以驗證其是否正常工作:
-- display the dynamic sql statement
SELECT @droplike;
執行上面語句,得到以下結果 -
mysql> SELECT @droplike;
+-----------------------------------------------------------------+
| @droplike |
+-----------------------------------------------------------------+
| DROP TABLE testdb.test1,testdb.test2,testdb.test3,testdb.test4; |
+-----------------------------------------------------------------+
1 row in set
可以看到它按預期工作。
之後,可以使用MySQL中的prepare語句執行語句如下:
-- execute dynamic sql
PREPARE stmt FROM @droplike;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
有關MySQL準備語句的更多資訊,請檢視MySQL準備語句教學。
把它們放在一起,如下所示 -
-- set table schema and pattern matching for tables
SET @schema = 'testdb';
SET @pattern = 'test%';
-- build dynamic sql (DROP TABLE tbl1, tbl2...;)
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(@schema,'.',table_name)),';')
INTO @droplike
FROM information_schema.tables
WHERE @schema = database()
AND table_name LIKE @pattern;
-- display the dynamic sql statement
SELECT @droplike;
-- execute dynamic sql
PREPARE stmt FROM @dropcmd;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
因此,如果要刪除在資料庫中具有特定模式的多個表,則只需使用上面的指令碼來節省時間。 所有您需要做的是在@pattern
和@schema
變數中替換模式和資料庫模式。 如果您經常需要處理此任務,則可以始終基於指令碼開發儲存過程,並重新使用此儲存過程。
在本教學中,我們向您展示了如何使用DROP TABLE
語句來刪除特定資料庫中的現有表。還討論了一種解決方法,允許使用DROP TABLE
語句根據模式匹配刪除表。