MySQL刪除表

2019-10-16 22:58:22

在本教學中,我們將向您展示如何使用MySQL DROP TABLE語句刪除資料中存在的表。

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語句僅刪除表及其資料。 但是,它不會刪除與表關聯的特定使用者許可權。 因此,如果在此之後重新建立了具有相同名稱的表,則現有許可權將適用於新錶,這可能會導致安全風險。

RESTRICTCASCADE標誌為未來版本的MySQL保留。最後但並非最不重要的是,必須具有要刪除的表的DROP許可權。

MySQL DROP TABLE範例

我們將刪除在使用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

MySQL DROP TABLE WITH LIKE

假設有許多表的名稱在資料庫中是以字元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;

使用相同的表結構建立了名為:test1test2test3test4的四個表。假設您想要一次刪除所有字串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 TABLEGROUP_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語句根據模式匹配刪除表。