错误:mysql foreign key errno 150

Mysql错误:ERROR 1005 (HY000): Can't create table 'mytable.#sql-191_1c5e4' (errno: 150)

alter table message_demo add cons
traint foreign key(type) references message_type(id) on delete cascade;

原因是message_demo表的type(外键)属性和message_type表的id(主键)定义不同,由于我是在建立表之后再建立的外键关系,之前给type字段加了个unsigned,而id字段又没加,因此报错。

参考:http://forums.devarticles.com/mysql-development-50/mysql-foreign-key-problem-errno-150t-7704.html

Finally. I found out what the problem was. It wasn't about the definition of the foreign key. actually it was the definition of the primary key field.
好久不使用外键,对级联操作都有点不记得了。

以下资料来自官方文档(MySQL 5.1 Reference Manual-cn):

15.2.6.4节,“FOREIGN KEY约束”

外键定义服从下列情况:

·         所有tables必须是InnoDB型,它们不能是临时表。

·         在引用表中,必须有一个索引,外键列以同样的顺序被列在其中作为第一列。这样一个索引如果不存在,它必须在引用表里被自动创建。

·         在引用表中,必须有一个索引,被引用的列以同样的顺序被列在其中作为第一列。

·         不支持对外键列的索引前缀。这样的后果之一是BLOB和TEXT列不被包括在一个外键中,这是因为对这些列的索引必须总是包含一个前缀长度。

·         如果CONSTRAINTsymbol被给出,它在数据库里必须是唯一的。如果它没有被给出,InnoDB自动创建这个名字。  

1.8.5.5. 外键

外键增强为数据库开发人员提供了多项益处:

·         假定关联设计恰当,外键约束使得程序员更难将不一致性引入数据库。

·         数据库服务器具有集中式约束检查功能,因而没有必要在应用程序一侧执行这类检查。这样,就消除了不同应用程序使用不同方式检查约束的可能性。

·         使用级联更新和删除,简化了应用程序代码。

·         设计恰当的外键有助于以文档方式记录表间的关系。

请记住,这些好处是以数据库服务器为执行必要检查而需的额外开销为代价的。服务器额外检查会影响性能,对于某些应用程序,该特性不受欢迎,应尽量避免。(出于该原因,在一些主要的商业应用程序中,在应用程序级别上实施了外键逻辑)。

你可能感兴趣的:(mysql,performance,key,manual,foreign)