【MySQL】解决MySQL删除外键(foreign key)时报错问题

文章目录

  • 【MySQL】解决MySQL删除外键(foreign key)时报错问题
    • 一、现象
    • 二、分析
    • 三、问题解决
    • 四、拓展

一、现象

  (1) 查看主表class_info和从表student。

MariaDB [class_info]> desc class_info;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| class_id   | int(2)      | NO   | PRI | 0       |       |
| class_name | varchar(10) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)MariaDB [class_info]> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| stu_id   | int(2)      | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| class_id | int(2)      | YES  |     | NULL    |       |
| score    | float(4,2)  | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

  (2) 在从表student上创建外键

MariaDB [class_info]> alter table student add foreign key (class_id) references class_info(class_id);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0MariaDB [class_info]> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| stu_id   | int(2)      | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| class_id | int(2)      | YES  | MUL | NULL    |       |
| score    | float(4,2)  | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

  (3) 在删除外键时抛出这样的错误

MariaDB [class_info]> alter table student drop foreign key class_id;
ERROR 1025 (HY000): Error on rename of './class_info/student' to './class_info/#sql2-1a32-13e' (errno: 152)

二、分析

  MySQL不能删除外键,报错 Error on rename of './class_info/student' to './class_info/#sql2-1a32-13e' (errno: 152)

  其实这是MySQL的一个不友好的地方而已,主要有以下几个原因:

  (1) MySQL在建外键后,会自动建一个同名的索引。

  (2) 在删除外键时,如果这个同名索引没有被删除,则MySQL认为外键仍然是存在的,在show index from [表名]命令里仍旧会显示外键。

  那么如何进行外键的删除呢?


三、问题解决

  要删除外键可以分三步:

  第一步: 查看外键约束:show create table [表名];

MariaDB [class_info]> show create table student\G
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (`stu_id` int(2) DEFAULT NULL,`name` varchar(10) DEFAULT NULL,`class_id` int(2) DEFAULT NULL,`score` float(4,2) DEFAULT NULL,KEY `class_id` (`class_id`),CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class_info` (`class_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

  第二步: 删除同名索引:alter table [表名] drop foreign key [同名索引];

  这里的同名索引是 CONSTRAINT 后面的 student_ibfk_1。可以看到在删除同名索引之后,外键仍然是存在的。

MariaDB [class_info]> alter table student drop foreign key student_ibfk_1;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0MariaDB [class_info]> show create table student\G
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (`stu_id` int(2) DEFAULT NULL,`name` varchar(10) DEFAULT NULL,`class_id` int(2) DEFAULT NULL,`score` float(4,2) DEFAULT NULL,KEY `class_id` (`class_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)MariaDB [class_info]> show index from student\G
*************************** 1. row ***************************Table: studentNon_unique: 1Key_name: class_idSeq_in_index: 1Column_name: class_idCollation: ACardinality: 0Sub_part: NULLPacked: NULLNull: YESIndex_type: BTREEComment:
Index_comment:
1 row in set (0.00 sec)MariaDB [class_info]> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| stu_id   | int(2)      | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| class_id | int(2)      | YES  | MUL | NULL    |       |
| score    | float(4,2)  | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

  第三步: 删除索引:alter table [表名] drop index [字段名]; 可以看到此时外键约束被删彻底删除。

MariaDB [class_info]> alter table student drop index class_id;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0MariaDB [class_info]> show index from student\G
Empty set (0.00 sec)MariaDB [class_info]> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| stu_id   | int(2)      | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| class_id | int(2)      | YES  |     | NULL    |       |
| score    | float(4,2)  | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

四、拓展

  MySQL中如果表和表之间建立的外键约束,则无法删除表及修改表结构。

  解决方法: 在MySQL中取消外键约束: set foreign_key_checks = 0; 然后将原有表数据导出到sql语句,重新创建此表后,再把数据使用sql导入,最后设置外键约束: set foreign_key_checks = 1;


【MySQL】解决MySQL删除外键(foreign key)时报错问题相关推荐

  1. 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)

    1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...

  2. Mysql完整性约束详解(字段唯一,非空,主键primary key,外键foreign key,自增长auto_increment)

    引入 1.什么是完整性约束, 为什么使用 为了规范数据格式, 在用户进行插入.修改.删除等操作时,DBMS(数据库管理系统(Data Base Management System))自动按照约束条件对 ...

  3. Java数据库foreign,mysql中的外键foreign key 作者:Java_xb

    一张表中可以有多个外键. 外键的默认作用有两点: 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败. 2.对父表的作用:对父表的主键字段进行 ...

  4. mysql中的foreignkey的作用_mysql中的外键foreign key

    一.如果一张表中有一个非主键的字段指向了别一张表中的主键,就将该字段叫做外键. 一张表中可以有多个外键. 外键的默认作用有两点: 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段 ...

  5. 解决因删除外键引用的时候导致相应字段被删除了的问题

    PowerDesigner中配置外键关系时, 如果要删除配置的外键关系, 默认设置会一同删除外键列. 要更改此设置, 需在菜单栏tools中打开Model Options, 在Model Settin ...

  6. MYSQL外键(Foreign Key)的使用

    在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持 ...

  7. mysql foreign key_MYSQL外键(Foreign Key)的使用

    在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持 ...

  8. mysql set foreign key_Mysql 外键(FOREIGN KEY)使用注意事项

    外键,FOREIGN KEY, 这个东东,作为DBA,在Oracle我们都不建议在数据库级别去实现约束,因为他的维护成本很高, 比如你要保证索引,导入数据时你得保证先后顺序等,所以我们更推荐由应用去控 ...

  9. mysql 外键(foreign key)的详解和实例_MySQL数据库外键

    设置外键 外键及功能:成绩表(参照表也叫子表)中的学号来自学生表(被参照表也叫父表),成绩表中的课程号来自课程表:当要删除或更新被参照表中的给字段的值时,参照表该字段的值如何改变.在on delete ...

最新文章

  1. 那个双非本科,还想转算法岗的姑娘,最后怎么了?
  2. C++STL的stack容器
  3. python的print
  4. java c s是什么_Java在C/S
  5. 软件工程复习提纲——第五章
  6. elk查询nginx日志响应时间
  7. YBT 2.4 AC自动机
  8. BOOST库介绍(七)——时间处理相关的库
  9. ERPS(Ethernet Ring Protection Switching):以太网多环保护技术
  10. JavaScript 编程精解 中文第三版 四、数据结构:对象和数组
  11. 婴儿级教学,手伤害教你用鸿蒙OS获取B站粉丝数!!
  12. 利用标准差剔除异常数据
  13. 大战略游戏:统治者:罗马 for Mac
  14. 北京剩女80万!全国十大单身男女盛产地都在哪?
  15. ubuntu18.04装coturn
  16. css3 特效大全,CSS3 特效范例整理
  17. 计算机专业2017大学排名,全国计算机专业大学排名2017计算机专业大学排名
  18. EM4100 低频125Khz ID卡
  19. Criteria用法的小结
  20. Android GLSurfaceView详解

热门文章

  1. 计算机绘图a,计算机绘图A.doc
  2. 使用C2P工业云获取门店每日销售统计
  3. 【YOLOX 解读】与 YOLOv5 匹敌的 anchor-free 目标检测器!
  4. [XJTUSE]面向对象考试复习指南
  5. cisco路由器EIGRP基础配置命令
  6. 麒麟 嵌入式linux操作系统_国产操作系统UOS适配晟元指纹识别 龙芯/兆芯等平台一键解锁...
  7. XorDDos木马清除
  8. Bower 基本应用介绍
  9. wait()函数的使用
  10. 数据库系统工程师(第一章)