刪除表是指刪除數據庫中已經存在的表。刪除表時,會刪除表中的所有數據。因此,我們在刪除表的時候要特別小心。
MySQL中通過DROP TABLE語句來刪除表。由於創建表時可能存在外鍵約束,一些表成爲了與之關聯的表的父類。要刪除這些表,情況還有點複雜,因爲不能直接刪除。
OK,這篇博客我在這裏詳細的整理下刪除沒有被關聯的普通表和被其他表關聯的父類的方法。- 1,刪除沒有被關聯的普通表
DROP TABLE 表名
其中,‘表名’參數爲要刪除的表的名稱。OK,現在我們來實際操作下數據庫:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(5) COLLATE utf8_bin NOT NULL,
`card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
`age` int(11) DEFAULT '25',
PRIMARY KEY (`id`),
UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
然後我要刪除到這張表,DROP TABLE user;
OK,沒問題,成功的刪除user表了。
- 2,刪除被其他表關聯的父表
OK,同樣的,現在我們離實際操作下數據庫,建表語句如下:
CREATE TABLE linkinframe.`user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(5) COLLATE utf8_bin NOT NULL,
`card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
`age` int(11) DEFAULT '25',
PRIMARY KEY (`id`),
UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `address` (
`id` int(11) NOT NULL,
`user_id` int(11) DEFAULT NULL,
`name` varchar(45) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id_idx` (`user_id`),
CONSTRAINT `user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
OK,現在我們刪除主表user,DROP TABLE linkinframe.user;
刪除失敗,數據庫報錯:Cannot delete or update a parent row: a foreign key constraint fails。
那要怎麼辦呢?
1,最簡單最直接的辦法是,先刪除子表address,然後在刪除父表。但是這樣子可能會影響到子表的其他數據
2,另一種辦法就是先刪除子表的外鍵約束,然後再刪除父表。這種辦法,不會影響到子表的其他數據,可以保證數據庫的安全。
實際操作中也是往往使用第2種方式,只刪除從表的外鍵約束而不是把整個從表都刪除掉。
OK,現在我們先去刪除從表address的外鍵約束:
ALTER TABLE linkinframe.address DROP foreign key user_id;
我們先來查看下從表的表結構:
DROP TABLE linkinframe.user;
OK,結果顯示user已經不存在了,主表刪除成功。
- 總結:
刪除一個表時,表中所有的數據也會被刪除。因此,在刪除表的時候一定要慎重。
最穩妥的做法就是先將表中所有的數據備份出來,然後在刪除表,一般刪除表後發現造成了損失,還可以通過備份的數據還原表,以便將損失降低到最小。