mysql 无法创建表 - 错误 1005
Posted
技术标签:
【中文标题】mysql 无法创建表 - 错误 1005【英文标题】:mysql cannot create table - error 1005 【发布时间】:2012-10-15 07:21:58 【问题描述】:我是一名学生,我只是在尝试一些基本的 mysql。但是,当涉及到以下代码时,我不断收到相同的错误。
错误代码:1005。无法创建表 'mydatabase.orders' (errno: 150)
CREATE TABLE Customer
(
P_ID int(3) UNSIGNED NOT NULL,
LastName varchar(10) NOT NULL,
FirstName varchar(10) NOT NULL,
Address varchar(20) NOT NULL,
City varchar(10) NOT NULL
);
CREATE TABLE Orders
(
O_ID int(3) UNSIGNED NOT NULL,
OrderNo int NOT NULL,
P_ID int(3) UNSIGNED NOT NULL,
PRIMARY KEY (O_ID),
FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)
);
【问题讨论】:
@GeekNum88:int
是一个完全有效的数据类型。 (3)
既不是长度定义,也不是对您可以在列中存储的内容的限制。这是一个提示,提示客户端应用程序应该显示列的宽度。
【参考方案1】:
错误代码:1005 -- 您的代码中的主键引用错误
通常是因为引用 FK 字段不存在。可能是您有拼写错误,或者检查大小写应该相同,或者字段类型不匹配。 FK 链接的字段必须与定义完全匹配。
第一步:
如果您在服务器上拥有管理员权限,您可能希望在收到错误后立即运行 MySQL 命令“SHOW INNODB STATUS”(或 MySQL 5.5“SHOW ENGINE INNODB STATUS”)。此命令显示日志信息和错误详细信息。
如果您的脚本在一台服务器上运行良好,但当您尝试在另一台服务器上运行时出现错误,则很有可能#6 是问题所在。不同版本的 MySQL 有不同的默认字符集设置,您可能在不知情的情况下在不同的服务器上分配了不同的字符集。
一些已知原因可能是:
-
两个关键字段类型和/或大小不完全匹配。为了
例如,如果一个是 INT(10),则关键字段也需要是 INT(10)
而不是 INT(11) 或 TINYINT。您可能需要确认字段大小
使用 SHOW CREATE TABLE 因为查询浏览器有时会在视觉上
只显示 INT(10) 和 INT(11) 的 INTEGER。您还应该检查
一个未签名,另一个未签名。他们都需要
完全一样。
您尝试引用的关键字段之一没有
索引和/或不是主键。如果在
关系不是主键,您必须为此创建一个索引
字段。
外键名称是现有键的副本。
检查您的外键名称在您的数据库中是唯一的。
只需在密钥名称的末尾添加几个随机字符即可进行测试
为此。
您的一个或两个表是 MyISAM 表。为了使用
外键,表必须都是 InnoDB。 (实际上,如果两个表
是 MyISAM,那么您将不会收到错误消息 - 它只是不会创建
键。)在查询浏览器中,您可以指定表类型。
您已在 DELETE SET NULL 上指定了级联,但相关的 关键字段设置为 NOT NULL。您可以通过更改您的 级联或设置字段以允许 NULL 值。
确保 Charset 和 Collate 选项在 表级别以及键列的单个字段级别。
您的外键列上有一个默认值(即 default=0)
关系中的一个字段是组合的一部分 (复合)键并且没有它自己的单独索引。甚至 尽管该字段有一个索引作为复合键的一部分,但您必须 仅为该键字段创建单独的索引,以便在 约束。
您的 ALTER 语句中有语法错误,或者您有 错误输入了关系中的字段名称之一
10 您的外键名称超过了 64 个字符的最大长度。
更多详情请参考:MySQL Error Number 1005 Can’t create table
【讨论】:
【参考方案2】:这个:
FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)
只有在你有的时候才有效
-
该客户(P_ID)字段的索引,因此您应该添加一个
使用 innodb -> 如果这不是您的默认引擎,您应该专门添加该引擎。
添加索引如下所示:
INDEX(P_ID)
我无法为您尝试,所以这里只是“干”编码,但我很确定就是这样。显然要注意,
放置之类的事情,但这应该可以工作。
【讨论】:
你将不得不在第一点用勺子喂我。添加innodb引擎没问题。但我不确定你所说的第一点是什么意思(我刚开始使用 mysql) 和加主键没太大区别,我加个例子 (另一个答案几乎相同,但添加了一个主键。只有当你真的想要一个主键时这才是正确的(我承认,这很可能),但如果你没有不想要主键(或其他主键)这是您的基本选择)【参考方案3】:这应该可以,客户表上没有PRIMARY KEY
。
EDIT删除了ON DELETE CASCADE ON UPDATE CASCADE
子句,可能不需要
CREATE TABLE Customer(
P_ID int(3) UNSIGNED NOT NULL,
LastName varchar(10) NOT NULL,
FirstName varchar(10) NOT NULL,
Address varchar(20) NOT NULL,
City varchar(10) NOT NULL,
PRIMARY KEY (`P_ID`)
);
CREATE TABLE Orders(
O_ID int(3) UNSIGNED NOT NULL,
OrderNo int(3) NOT NULL,
P_ID int(3) UNSIGNED NOT NULL,
PRIMARY KEY (O_ID),
CONSTRAINT `P_ID` FOREIGN KEY(`P_ID`) REFERENCES `Customer` (`P_ID`)
);
【讨论】:
这行得通。至少它不是缺少分号,对吧? :p 谢谢一百万。 不客气,无需感谢 ;) 这就是这个地方的目的,帮助他人和分享知识【参考方案4】:运行以下查询:
CREATE TABLE Customer
(
P_ID int(3) UNSIGNED NOT NULL,
LastName varchar(10) NOT NULL,
FirstName varchar(10) NOT NULL,
Address varchar(20) NOT NULL,
City varchar(10) NOT NULL,
PRIMARY KEY (P_ID)
);
CREATE TABLE Orders
(
O_ID int(3) UNSIGNED NOT NULL,
OrderNo int NOT NULL,
P_ID int(3) UNSIGNED NOT NULL,
PRIMARY KEY (O_ID),
FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)
);
在声明P_ID为外键之前,必须先声明为主键。
【讨论】:
以上是关于mysql 无法创建表 - 错误 1005的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 错误:#1005 - 无法创建表 (errno: 150) 当我尝试创建超过 1 个 FK
MySQL 错误:#1005 - 无法创建表 (errno: 150) 当我尝试创建超过 1 个 FK
MySQL“错误 1005 (HY000): 无法创建表 'foo.#sql-12c_4' (errno: 150)”