当你试图在mysql中创建一个外键的时候,这个出错会经常发生,这是非常令人沮丧的。像这种不能创建一个.frm
文件的报错好像暗示着操作系统的文件的权限错误或者其它原因,但实际上,这些都不是的,事实上,这个mysql报错已经被报告是一个mysql本身的
bug并出现在mysql 开发者列表当中很多年了,然而这似乎又是一种误导。
在很多实例中,这种错误的发生都是因为mysql一直以来都不能很好的支持的关系的问题, 更不幸的是它也并没有指明到底是哪一个问题会导致上面那种错误,下面我把导致这个可怕 的150错误的常见原因列出来了,并且我以可能性的大小作了排序
已知的原因:
1, 两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是
TINYINT. 你得使用 SHOW 命令来查看字段的大小,因为一些查询浏览器有时候把 int(10) 和int(11)
都显示为integer。另外,你还必须确定两个字段是否一个为 SIGNED,而另一个又是UNSIGNED,
这两字段必须严格地一致匹配,更多关于signed 和 unsigned
的信息,请参阅:http://www.verysimple.com/blog/?p=57
2, 你试图引用的其中一个外键没有建立起索引,或者不是一个primary key , 如果其中一个不是primary key 的放,你必须为它创建一个索引。
3, 外键的名字是一个已经存在的一个键值了,这个时候,你应该检查你的数据库以确保外健名字是唯一的,或者你在键名后面加上几个随机的字符以测试是否是这个原因。
4, 其中一个或者两个表是MyISAM引擎的表,若想要使用外键约束,必须是InnoDB引擎,(实际上,如果两个表都是MyISAM 引擎的,这个错误根本不会发生,但也不会产生外键),你可以通过查询浏览器来设置表的引擎类型
5, 你可能设置了ON DELETE SET NULL, 但是相关的键的字段又设置成了NOTS NULL 值。你可能通过修改cascade 的属性值或者把字段属性设置成 allow null 来搞定这个bug.
6, 请确定你的Charset 和 Collate 选项在表级和字段级上的一致
7, 你可能设置为外键设置了一个默认值,如 default=0
8, 在这个关系里面,其中的一个字段是一个混合键值中的一个,它没有自己独立的索引,这时,你必须为它创建一个独立的索引。
9, ALTER 声明中有语法错误
分享到:
相关推荐
MySQL 外键
在MySQL数据库中,可以通过特定的语法结构来增加外键,即便在建表时未设置外键也能在之后进行添加。本文详细介绍了在MySQL中增加外键的方法,并提供了使用PHPMyAdmin管理工具和SQL语句来实现外键添加的操作步骤和...
数据库表A: CREATE TABLE task_desc_tab ( id INT(11) PRIMARY KEY NOT NULL COMMENT '自增主键' AUTO_INCREMENT, <strong>taskname</strong> VARCHAR(200) NOT NULL COMMENT '任务名字', sqlname VARCHAR(20) ...
在创建外键时,要求父表必须有对应的索引,子表在创建外键时也会自动创建对应的索引。在创建索引时,可以指定在删除、更新父表时,对子表进行的相应操作,包括 RESTRICT、NO ACTION、SET NULL 和 CASCADE。其中 ...
总之,解决MySQL创建外键时的ERROR 1005需要细致的错误分析和SQL语句审查。通过使用`SHOW ENGINE INNODB STATUS;`命令获取详细的错误信息,然后根据这些信息调整外键定义,通常可以成功创建外键并确保数据库结构的...
MySQL 处理添加外键时提示 Error 150 问题的解决方法 MySQL 中添加外键时,可能会遇到 Error 150 的问题,这个问题是 MySQL 本身的 bug,已经被报告到 MySQL 开发者列表中很多年了。然而,导致这个错误的原因却并...
本文将深入探讨MySQL无法创建外键的原因及解决方法。 首先,外键创建失败最常见的原因是字符集(Charset)和校对规则(Collate)不一致。当两张需要关联的表的字符集和校对规则不匹配时,MySQL将无法成功创建外键。...
建立外键的前提:本表的列必须与外键类型相同(外键必须是外表主键)。 外键作用: 使两张表形成关联,外键只能引用外表中的列的值!...主键 id 类型 int 创建含有外键的表: create table temp( id i
创建外键时,需要确保以下几个条件: - 外键列的数据类型必须与引用的主键列相同。 - 外键列的值必须存在于引用的主键列中,或者为NULL(如果允许的话)。 - 使用`FOREIGN KEY`关键字来定义外键约束。 3. **...
如果不一致,MySQL将无法识别并创建外键约束。 3. **NULL值处理**: 外键字段可以允许`NULL`值,这意味着子表中的一些记录可能没有对应的父表记录。然而,这可能会影响数据完整性。如果希望外键字段不能为空,应...
然而,有时在创建外键时可能会遇到错误代码1005,这通常是由于多种原因导致的。以下是一些常见的问题和解决方案: 1. **缺少InnoDB插件**:MySQL的外键功能依赖于InnoDB存储引擎,因为它提供了行级锁定和事务处理,...
MySQL 外键的定义、作用、添加和删除 外键是指引用另外一个表中的一列或多列数据,被引用的列应该具有主键约束或者唯一性约束。外键用来建立和加强两个表数据之间的连接。例如,在学生档案和成绩单两张表中,如果...
这里以创建一个简单的员工和部门的数据库为例来演示如何创建外键。 1. **创建主表(Departments)** ```sql CREATE TABLE Departments ( DepartmentID INT AUTO_INCREMENT, DepartmentName VARCHAR(50), ...
在MySQL中,创建外键的语法如下: ```sql ALTER TABLE news_info[子表名] ADD CONSTRAINT FK_news_info_news_type[约束名] FOREIGN KEY (info_id)[子表列] REFERENCES news_type[主表名] (id)[主表列]; ``` ...
然而,使用InnoDB存储引擎,可以创建外键约束,让数据库自身来处理这些关系,如: ```sql ALTER TABLE `comments` ADD FOREIGN KEY (`blog_id`) REFERENCES `blogs`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; ``...
在MySQL 4.1.2之后的版本,创建外键时如果没有索引,系统会自动创建。但在更早的版本,需要手动创建索引。 3. 外键列和参照列的数据类型必须兼容,即它们之间能够进行数据类型转换,例如int和tinyint,但int和char则...
MySQL创建数据表并建立主外键关系是数据库设计中常见的操作,这对于数据的一致性和完整性至关重要。主键和外键是关系型数据库中的关键概念,它们用于确保数据的关联性和引用完整性。 首先,让我们理解一下主键和...