6.4删除表
删除表是指删除数据库中己存在的表。删除表时,会删除表中的所有数据。因此,在删除表时要特别注意。MySQL中通过DROP TABLE语句来删除表。由于创建表时可能存 在外键约朿,一些表成为了与之关联的表的父表。要删除这些父表,情况比较复杂。本节 将详细讲解删除没有被关联的普通表和被其他表关联的父表的方法。
6.4.1删除没有被关联的普通表
MySQL中,直接使用DROP TABLE语句可以删除没有被其他关联的普通表。其基本 语法如下:
DROP TABLE 表名;
其中,“表名”参数为要删除的表的名称。
【示例】下面将删除example5表。SQL语句如下:
DROP TABLE example5;
如果代码运行成功,将从数据库中删除example5表。在执行代码之前,先用DESC语 句查看是否存在example5表,以便与删除后进行对比。DESC语句执行后的显示结果如下:
mysql> DESC example5; +---------+-----------+-------+-------+----------+-------+ | Field | Type | NULL | kEY | Default | Extra | +---------+-----------+-------+-------+----------+-------+ | id | int(11) | No | PRI | | | | stu_id | int(11) | YES | UNI | NULL | | | name |varchar(20)| NO | | | | +---------+-----------+-------+-------+----------+-------+ 3 rows in set(0.00 sec)
从查询结果可以看出,当前存在example5表。然后,执行DROP TABLE语句删除表。执行结果如下:
mysql> DROP TABLE example5 ;
Query OK, 0 rows affected (0.02 sec)
代码执行完毕,结果显示修改成功。为检验数据库中是否还存在example5表,使用 DESC语句重新查看example5表。查看结果如下:mysql> DESC example5;ERROR 1146 (42S02): Table 'example.example5' doesn't exist
査询结果显示,example5表已经不存在,操作成功。
技巧:删除一个表时,表中的所有数据也会被删除。因此,在删除表的时候一定要慎重。最稳妥的做法是先将表中所有的数据备份出来,然后再删除表。一旦删除表后发 现造成了损失,可以通过备份的数据还原表,以便将损失降低到最小。
6.4.2删除被其他表关联的父表
在6.1.3小节中讲解了创建表时设置表的外键。这样就使数据库中的某些表之间建立 了关联关系。一些表成为了父表,这些表被其子表关联着。要删除这些父表,情况不像上一节那么简单。
下面将要删除6.1节中创建的examole1表。SQL代码如下:
DROP TABLE example1 ;
代码执行后,结果显示如下:
mysql>DROP TABLE example1; ERROR 1217(23000):Cannot delete or update a parent row:a foreign key constraint fails
结果显示删除失败,原因为有外键依赖于该表。因为6.1节中创建了 example4表依赖 于examplel表。example4表的外键stu_id依赖于examplel表的主键。examplel表是 example4表的父表。如果要删除example4表,必须先去掉这种依赖关系。最简单直接的 办法是,先删除子表example4,然后再删除父表狀example1。但这样可能会影响子表的其他数据;另一种办法是,先删除子表的外键约朿,然后再删除父表。这种办法,不会影响子表的其他数据,可以保证数据库的安全。因此,本小节将重点讲解这种办法。首先,根据6.3.8小节的方法,删除example4表的外键约束。先用SHOW CREATE TABLE语句查看example4表的外键別名,执行如下:
mysql> show create table example4 \G;**********************************1.row****************************Table:example4Create Table:CREATE TABLE 'example4'('id' int(11) NOT NULL,'name' varchar(20) NOTNULL,'stu_id' int(11) default Null,PRIMARY KEY('id'),KEY 'd_fk'('stu_id'),CONSTRAINT 'd_fk' FOREEIGN KEY('stu_id') REFERENCES 'example1'('stu_id'))ENGINE=InonoDB DEFAULT CHARSET=utf81 row in set(0.00 sec)
查询结果显示,example4表的外键别名为d_fk。然后执行ALTERTABLE语句,删除example4表的外键约束,详细知识见6.3.8小节。删除example4表的外键的SQL语句如下:
ALTER TABLE example4 DROP FOREIGN KEY d_fk;
执行结果如下:
mysql> show create table example4 \G; **********************************1.row**************************** Table:example4 Create Table:CREATE TABLE 'example4'( 'id' int(11) NOT NULL, 'name' varchar(20) NOTNULL, 'stu_id' int(11) default Null, PRIMARY KEY('id'), KEY 'd_fk'('stu_id'), CONSTRAINT 'd_fk' FOREEIGN KEY('stu_id') REFERENCES 'example1'('stu_id') )ENGINE=InonoDB DEFAULT CHARSET=utf8 1 row in set(0.00 sec)
为查看example4表的外键约束是否已经被删除,使用SHOW CREATE TABLE语句查询,查询结果如下:
mysql>ALTER TABLE example4 DROP FOREIGN KEY d_fk; Query OK 3 rows affected(0.01 sec) Records :3 Duplicates:0 Warning:0
查询结果显示,example4表中己经不存在外键。现在,已经消除了example4表与examplel表的关联关系,即可直接使用DROP TABLE语句删除examplel表。SQL代码如下:
DROP TABLE example1;
执行结果如下:
mysql> DROP TABLE example1;
Query OK, 0 rows affected (0.00 sec)
结果显示,操作成功。可以使用语句查询DESC语句查询example表是否存在,结果如下:执行结果显示,examplel表已经不存在,说明examplel表已经删除成功。
mysql>DESC example1;
error 1146(42S02);Table 'example.example1' doesn't exist