被参照表:

| 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,外键也会创建索引相关推荐

  1. Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 怎么办?

    删除要成为外键的列. 再次创建它 尝试再次将其设置为外键.

  2. Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 原因及解决方法

    报错的原因大概分为三种: 原因一: 添加的外键列与另一个表的唯一索引列(一般是主键)的数据类型不同 原因二: 要添加外键的表类型与另一个表的存储引擎是不是都为innodb引擎 #查看表引擎 法一: s ...

  3. mysql 导入数据 1215,导入sql出现:#1215 – Cannot add foreign key constraint错误的解决办法...

    今天在数据库后台导入一个mysql文件时,出现了:1215 – Cannot add foreign key constraint这样的错误提示. 百度了一下,网友们给出的解决办法一般是这样的: 外键 ...

  4. MySQL遇到错误:1217 - Cannot delete or update a parent row: a foreign key constraint fails

    遇到问题 今天在准备"删库跑路"的时候,有的数据表再删除的时候报了以下错误: 1217 - Cannot delete or update a parent row: a fore ...

  5. 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 ...

  6. mysql 错误号1005_mysql - 错误代码:1005。无法创建表'...'(错误号:150)

    mysql - 错误代码:1005.无法创建表'...'(错误号:150) 我在互联网上搜索了这个问题的解决方案并检查了SO问题,但没有解决方案适用于我的情况. 我想从表sira_no到metal_k ...

  7. mysql 错误信息大全,MySQL错误信息记录

    MySQL错误信息记录 MySQL错误信息记录 考虑到MySQL是一门玄学,难免有些看不见的坑要踩,于是开这篇博文,以此来记录学习及以后使用过程中踩过的Error,如果你也想加入欢迎留言参加 ERRO ...

  8. 关于MySQL错误 2005 - Unknown MySQL server host ‘localhost‘ (0) 原因及解决方法

    关于MySQL错误 2005 - Unknown MySQL server host 'localhost' (0) 原因及解决方法 参考文章: (1)关于MySQL错误 2005 - Unknown ...

  9. mysql添加外键1215错误_MySQL添加外键时报错:1215 Cannot add the foreign key constraint的解决方法...

    前言 这篇文章主要涉及到在数据创建表时,遇到ERROR 1215 (HY000): Cannot add foreign key constraint 问题方面的内容,对于在数据创建表时,遇到同样问题 ...

最新文章

  1. SYSENTER——快速系统调用
  2. Flink 1.12 资源管理新特性
  3. SOL注入——基干联合查询的POST注入(四)
  4. 如何在vue中使用图形验证码
  5. matlab dtft的函数,DTFT的Matlab矩阵计算的理解
  6. 在Windows下安装JDK的通常步骤
  7. idea项目结构树状展示_「软件项目管理入门」(26)如何做功能结构设计?
  8. 2021了,不会还有测试人员认为Jmeter就等于性能测试吧!
  9. class matplotlib.figure.Figure
  10. linux100台服务器免密,多台Linux服务器之间互相免密登陆,脚本同步免密
  11. 代码性能JavaScript性能优化总结
  12. 设计模式之适配器与外观模式(二)
  13. 电脑W7系统怎样安装鸿蒙系统,家用电脑升级win7系统的操作方法
  14. Oracle 分组求和(特殊处理)
  15. 方差 标准差_财务思维:资产风险衡量中的收益率方差、标准差怎么理解运用?...
  16. PLC控制系统如何抵抗干扰
  17. QQ游戏当前在线总人数查看
  18. 华为发布八核处理器Kirin 920
  19. 解决Qt5.7.0 cannot find -lGL
  20. 解决xyplorer删除后,显示“找不到应用程序”错误

热门文章

  1. Android之一个简单计算器源代码
  2. 记录解决grpc message exceeds maximum size 4194304 限制问题
  3. js数组交集并集差集
  4. 大专生从零开始学习c#的第十一天
  5. 国际化(Internationalization)
  6. 一起学:仓库管理的相关指标
  7. 后缀为php但是bin文件,什么是bin文件,后缀名bin是什么文件
  8. 明佳妈妈新营销谈要做好微博营销需要注意什么?
  9. css解决uniapp使用image标签图片无法撑满全屏问题
  10. 《软技能》读后感——程序员自我改变