mysql 错误号1553 MySQL Cannot drop index needed in a foreign key constraint,外键也会创建索引
表
被参照表:
| teacher | CREATE TABLE `teacher` (`id` varchar(20) NOT NULL,`name` varchar(255) DEFAULT NULL,`salary` decimal(10,2) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
参照表:
| teacher_student | CREATE TABLE `teacher_student` (`teacher_id` varchar(20) NOT NULL,`student_id` varchar(20) NOT NULL,PRIMARY KEY (`teacher_id`,`student_id`),KEY `student_id_FK` (`student_id`),CONSTRAINT `student_id_FK` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `teacher_id_PK` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`teacher_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
错误再现
当外键约束完成的时候,我在用自然连接的时候发现,id写错了,于是我想改一下。这一改就改出了一个知识 - -
分析原因
字面意思是,mysql不能drop掉索引 ‘primary’,在外键约束上被需要。就是说,主键上是有名为primary
的索引的,并且关联了外键,这个时候是无法对这个被参照的对象进行修改(删除)的。
解决问题
删除外键。
mysql> alter table teacher_student drop foreign key student_id_FK;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> alter table teacher_student drop foreign key teacher_id_PK;
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
将两个外键先删掉之后,便可以修改被参照表的列名,那么为什么会存在这样的问题呢?现在想想其实很明显,建立表的时候 我们协商了约束条件,写好了references 表名(列名),这个时候如果改掉了被参照的列名,那么这个约束自然出现了问题。
更进一步-外键也会有索引
看到了索引这个东西,我忽然想起了,之前的一个印象,主键会创建索引,但是我在navicat上 点击索引的时候,奇怪的事情发生了,上面竟然没有写- -主键索引,于是我就用命令行去查看了一下。如下:
mysql> show index from teacher_student;
+-----------------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| teacher_student | 0 | PRIMARY | 1 | teacher_id | A | 1 | NULL | NULL | | BTREE | | |
| teacher_student | 0 | PRIMARY | 2 | student_id | A | 2 | NULL | NULL | | BTREE | | |
| teacher_student | 1 | student_id_FK | 1 | student_id | A | 2 | NULL | NULL | | BTREE | | |
+-----------------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
由此验证了,确实会创建主键索引,这么一看就看见了一个我之前不知道的东西,这边多了一个索引。这个索引来自何处?于是我便又查看了create table:
| teacher_student | CREATE TABLE `teacher_student` (`teacher_id` varchar(20) NOT NULL,`student_id` varchar(20) NOT NULL,PRIMARY KEY (`teacher_id`,`student_id`),/*这里多了一个key*/KEY `student_id_FK` (`student_id`),CONSTRAINT `student_id_FK` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `teacher_id_PK` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`teacher_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
意外发现,这边多了一个key,我记得很清楚,当时建表的时候我并没有指定这个key,查了点资料发现可能是由于外键的约束而产生了一个普通的key,普通的key可以作为是一种普通的index作用,于是便有了下面的试验。test作为参照列,只指定primary key。show create table之后:
| test | CREATE TABLE `test` (`name` varchar(255) NOT NULL,`test` varchar(20) DEFAULT NULL,PRIMARY KEY (`name`),KEY `test` (`test`),CONSTRAINT `test` FOREIGN KEY (`test`) REFERENCES `teacher` (`teacher_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
果不其然,在创建外键的时候也会给它一个索引,会建立一个key,所以至少得到一个结论,除了主键,外键也会建立索引的~
总结
这次主要是记录下约束了外键之后,再修改表的方法,顺便还知道了外键也会创建索引,还学会了几条命令。
附上各种修改操作命令:
mysql 错误号1553 MySQL Cannot drop index needed in a foreign key constraint,外键也会创建索引相关推荐
- Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 怎么办?
删除要成为外键的列. 再次创建它 尝试再次将其设置为外键.
- Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 原因及解决方法
报错的原因大概分为三种: 原因一: 添加的外键列与另一个表的唯一索引列(一般是主键)的数据类型不同 原因二: 要添加外键的表类型与另一个表的存储引擎是不是都为innodb引擎 #查看表引擎 法一: s ...
- mysql 导入数据 1215,导入sql出现:#1215 – Cannot add foreign key constraint错误的解决办法...
今天在数据库后台导入一个mysql文件时,出现了:1215 – Cannot add foreign key constraint这样的错误提示. 百度了一下,网友们给出的解决办法一般是这样的: 外键 ...
- MySQL遇到错误:1217 - Cannot delete or update a parent row: a foreign key constraint fails
遇到问题 今天在准备"删库跑路"的时候,有的数据表再删除的时候报了以下错误: 1217 - Cannot delete or update a parent row: a fore ...
- Mysql报错 Cannot delete or update a parent row: a foreign key constraint fails
mysql数据库中使用delete语句删除表中的一条信息时,报错:1451 - Cannot delete or update a parent row: a foreign key constrai ...
- mysql 错误号1005_mysql - 错误代码:1005。无法创建表'...'(错误号:150)
mysql - 错误代码:1005.无法创建表'...'(错误号:150) 我在互联网上搜索了这个问题的解决方案并检查了SO问题,但没有解决方案适用于我的情况. 我想从表sira_no到metal_k ...
- mysql 错误信息大全,MySQL错误信息记录
MySQL错误信息记录 MySQL错误信息记录 考虑到MySQL是一门玄学,难免有些看不见的坑要踩,于是开这篇博文,以此来记录学习及以后使用过程中踩过的Error,如果你也想加入欢迎留言参加 ERRO ...
- 关于MySQL错误 2005 - Unknown MySQL server host ‘localhost‘ (0) 原因及解决方法
关于MySQL错误 2005 - Unknown MySQL server host 'localhost' (0) 原因及解决方法 参考文章: (1)关于MySQL错误 2005 - Unknown ...
- mysql添加外键1215错误_MySQL添加外键时报错:1215 Cannot add the foreign key constraint的解决方法...
前言 这篇文章主要涉及到在数据创建表时,遇到ERROR 1215 (HY000): Cannot add foreign key constraint 问题方面的内容,对于在数据创建表时,遇到同样问题 ...
最新文章
- SYSENTER——快速系统调用
- Flink 1.12 资源管理新特性
- SOL注入——基干联合查询的POST注入(四)
- 如何在vue中使用图形验证码
- matlab dtft的函数,DTFT的Matlab矩阵计算的理解
- 在Windows下安装JDK的通常步骤
- idea项目结构树状展示_「软件项目管理入门」(26)如何做功能结构设计?
- 2021了,不会还有测试人员认为Jmeter就等于性能测试吧!
- class matplotlib.figure.Figure
- linux100台服务器免密,多台Linux服务器之间互相免密登陆,脚本同步免密
- 代码性能JavaScript性能优化总结
- 设计模式之适配器与外观模式(二)
- 电脑W7系统怎样安装鸿蒙系统,家用电脑升级win7系统的操作方法
- Oracle 分组求和(特殊处理)
- 方差 标准差_财务思维:资产风险衡量中的收益率方差、标准差怎么理解运用?...
- PLC控制系统如何抵抗干扰
- QQ游戏当前在线总人数查看
- 华为发布八核处理器Kirin 920
- 解决Qt5.7.0 cannot find -lGL
- 解决xyplorer删除后,显示“找不到应用程序”错误