当前位置:嗨网首页>书籍在线阅读

23-删除被其他表关联的主表

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.4.2 删除被其他表关联的主表

在数据表之间存在外键关联的情况下,如果直接删除父表,结果会显示失败。原因是直接删除,将破坏表的参照完整性。如果必须要删除,可以先删除与它关联的子表,再删除父表,只是这样同时删除了两个表中的数据。但有的情况下可能要保留子表,这时如要单独删除父表,只需将关联的表的外键约束条件取消,然后就可以删除父表,下面讲解这种方法。

在数据库中创建两个关联表,首先,创建表tb_dept2,SQL语句如下。

mysql> CREATE TABLE tb_dept2 ( id INT(11)PRIMARY KEY, name VARCHAR(22), location VARCHAR(50) );

接下来创建表tb_emp,SQL语句如下。

mysql> CREATE TABLE tb_emp ( id INT(11)PRIMARY KEY, name VARCHAR(25), deptId INT(11), salary FLOAT, CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept2(id) );

使用SHOW CREATE TABLE命令查看表tb_emp的外键约束,结果如下。

mysql> SHOW CREATE TABLE tb_emp\G 1.row Table: tb_emp Create Table: CREATE TABLE 'tb_emp' ( 'id' int(11) NOT NULL, 'name' varchar(25) DEFAULT NULL, 'deptId' int(11) DEFAULT NULL, 'salary' float DEFAULT NULL, PRIMARY KEY ('id'), KEY 'fk_emp_dept' ('deptId'), CONSTRAINT 'fk_emp_dept' FOREIGN KEY ('deptId') REFERENCES 'tb_dept2' ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)

可以看到,以上执行结果创建了两个关联表tb_dept2和表tb_emp。其中,tb_emp表为子表,具有名为fk_emp_dept的外键约束;tb_dept2为父表,其主键id被子表tb_emp所关联。

【范例5-27】

删除被数据表tb_emp。

首先,直接删除父表tb_dept2,输入删除语句如下。

mysql> DROP TABLE tb_dept2; ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

可以看到,如前所述,在存在外键约束时,主表不能被直接删除。

接下来,解除关联子表tb_emp的外键约束,SQL语句如下。

ALTER TABLE tb_emp DROP FOREIGN KEY fk_emp_dept;

语句成功执行后,将取消表tb_emp和tb_dept2之间的关联关系,此时,可以输入删除语句,将原来的父表tb_dept2删除,SQL语句如下。

DROP TABLE tb_dept2;

最后通过“SHOW TABLES;”查看数据表列表,结果如下。

mysql> SHOW TABLES; +--------------+ | Tables_in_aa | +--------------+ |tb_dept1 | | tb_deptment3 | ……

可以看到,数据表列表中已经不存在名为tb_dept2的表。