Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1401502
  • 博文数量: 244
  • 博客积分: 3321
  • 博客等级: 中校
  • 技术积分: 2704
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-26 08:17
个人简介

微信公众号:杰夫弹弹看

文章分类

全部博文(244)

文章存档

2018年(4)

2017年(32)

2016年(25)

2015年(28)

2014年(27)

2013年(34)

2012年(25)

2011年(30)

2010年(39)

分类: Mysql/postgreSQL

2017-06-14 07:59:20

最近在 Django 项目执行 Migration 的时候发现一个奇怪的报错:

File "/usr/lib64/python2.7/site-packages/django/db/backends/mysql/base.py", line 124, in execute

return self.cursor.execute(query, args)

File "/usr/lib64/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute

self.errorhandler(self, exc, value)

File "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler

raise errorclass, errorvalue

django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')

在新数据库 CI Migration 测试中是没有发现这类问题的,后来 Google 发现有类似的问题和分析 [1],于是整理一下,以备其他人参考
这是因为老系统原来的表使用的是 MyISAM 引擎,但是现在 MySQL 新版本默认的表都是 InnoDB 了,而 MyISAM 是不支持外键约束的。
MyISAM  在 MySQL 5.5.1 之前是默认的引擎
InnoDB   在 MySQL 5.5 之后是默认的引擎

所以如果你的老的表是 MyISAM,而新表对此有外键引入, 那么自然会报上面的错误了。

解决方法也很简单:(修改旧表引擎为 InnoDB),具体如下:

    ALTER TABLE   ENGINE = InnoDB;

如何查看表的信息:

1. 查看所有表的信息

   SHOW TABLE STATUS FROM `DB_NAME`;

2. 查看某个表的信息

    SHOW TABLE STATUS FROM `DB_NAME` LIKE 'TABLE_NAME';

参考资料:
1. 
2. 
3. 
5. 


阅读(6040) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~