【MySQL】解决MySQL删除外键(foreign key)时报错问题
【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)时报错问题相关推荐
- 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)
1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...
- Mysql完整性约束详解(字段唯一,非空,主键primary key,外键foreign key,自增长auto_increment)
引入 1.什么是完整性约束, 为什么使用 为了规范数据格式, 在用户进行插入.修改.删除等操作时,DBMS(数据库管理系统(Data Base Management System))自动按照约束条件对 ...
- Java数据库foreign,mysql中的外键foreign key 作者:Java_xb
一张表中可以有多个外键. 外键的默认作用有两点: 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败. 2.对父表的作用:对父表的主键字段进行 ...
- mysql中的foreignkey的作用_mysql中的外键foreign key
一.如果一张表中有一个非主键的字段指向了别一张表中的主键,就将该字段叫做外键. 一张表中可以有多个外键. 外键的默认作用有两点: 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段 ...
- 解决因删除外键引用的时候导致相应字段被删除了的问题
PowerDesigner中配置外键关系时, 如果要删除配置的外键关系, 默认设置会一同删除外键列. 要更改此设置, 需在菜单栏tools中打开Model Options, 在Model Settin ...
- MYSQL外键(Foreign Key)的使用
在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持 ...
- mysql foreign key_MYSQL外键(Foreign Key)的使用
在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持 ...
- mysql set foreign key_Mysql 外键(FOREIGN KEY)使用注意事项
外键,FOREIGN KEY, 这个东东,作为DBA,在Oracle我们都不建议在数据库级别去实现约束,因为他的维护成本很高, 比如你要保证索引,导入数据时你得保证先后顺序等,所以我们更推荐由应用去控 ...
- mysql 外键(foreign key)的详解和实例_MySQL数据库外键
设置外键 外键及功能:成绩表(参照表也叫子表)中的学号来自学生表(被参照表也叫父表),成绩表中的课程号来自课程表:当要删除或更新被参照表中的给字段的值时,参照表该字段的值如何改变.在on delete ...
最新文章
- 那个双非本科,还想转算法岗的姑娘,最后怎么了?
- C++STL的stack容器
- python的print
- java c s是什么_Java在C/S
- 软件工程复习提纲——第五章
- elk查询nginx日志响应时间
- YBT 2.4 AC自动机
- BOOST库介绍(七)——时间处理相关的库
- ERPS(Ethernet Ring Protection Switching):以太网多环保护技术
- JavaScript 编程精解 中文第三版 四、数据结构:对象和数组
- 婴儿级教学,手伤害教你用鸿蒙OS获取B站粉丝数!!
- 利用标准差剔除异常数据
- 大战略游戏:统治者:罗马 for Mac
- 北京剩女80万!全国十大单身男女盛产地都在哪?
- ubuntu18.04装coturn
- css3 特效大全,CSS3 特效范例整理
- 计算机专业2017大学排名,全国计算机专业大学排名2017计算机专业大学排名
- EM4100 低频125Khz ID卡
- Criteria用法的小结
- Android GLSurfaceView详解