删除表是指删除数据库中已经存在的表。删除表时,会删除表中的所有数据。因此,我们在删除表的时候要特别小心。
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已经不存在了,主表删除成功。
- 总结:
删除一个表时,表中所有的数据也会被删除。因此,在删除表的时候一定要慎重。
最稳妥的做法就是先将表中所有的数据备份出来,然后在删除表,一般删除表后发现造成了损失,还可以通过备份的数据还原表,以便将损失降低到最小。