最近在做网站,C#+MySQL,然而在建表的时候遇到了一大堆的问题,特别是建外键,呵呵呵,消耗了一上午的时间也没成,一直报err150。上网查资料发现也不是很全,最后看到了一些比较有用的方法对付err150,推荐给大家。。。
1.InnoDB引擎问题
在建表时,将表类型设置成innodb,写法是
CREATE TABLE TABLENAME(
NUMBERR VARCHAR(15),
NAME VARCHAR(10),
GENDER TINYINT
) ENGINE=InnoDB;
其中一个或者两个表是MyISAM引擎的表,若想要使用外键约束,必须是InnoDB引擎,(实际上,如果两个表都是MyISAM 引擎的,这个错误根本不会发生,但也不会产生外键),你可以通过查询浏览器来设置表的引擎类型。
友好提示:大家最好用命令行建表和改动表,因为如果使用可视化界面,比如navicat,有可能会出错,虽然几率挺小,但笔者的学长做项目的时候遇到了这种情况,排除了很久才发现,竟然是用可视化数据库的建表出了问题,这是血泪的教训,所以如果在用可视化界面建表做项目的童鞋最好在做些比较重要的操作的时候用命令行。
还有额,笔者学长还建议用大写会更加规范些。【好像跑远了。。。】
2.类型问题
两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是 TINYINT. 你得使用 SHOW 命令来查看字段的大小,因为一些查询浏览器有时候把 int(10) 和int(11) 都显示为integer。另外,你还必须确定两个字段是否一个为 SIGNED,而另一个又是UNSIGNED, 这两字段必须严格地一致匹配。即字段与字段的建立起外键,这两者的类型应是一样的。
3.字符集的bug(我就是这么掉坑里)
如果你实在不知道哪错了那就检查表的字符编码,笔者已把数据库的默认设置设置为utf8,还以为天衣无缝,但too young too simple ,我还是愉快的掉坑了。跟类型的严格匹配一样,对应的字段的字符编码必须一致。建议大家在建表时这么写 ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.要为你的被外键对象建立索引
如果你的被外键对象是primary key是最好的,如果不是,最好为这个字段建立索引。
5.外键名必须唯一
这个可能性不大,但是也是有可能的,你的外键名必须是唯一的,如果重名请修改外键名。
6.alter语句出错
这个可能性也不大。但还是拿出来说说。
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (字段名) REFERENCES 被联系的表名(被外键的字段名);------添加外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;-------删除外键
整理from:http://www.jb51.net/article/28903.htm