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 和 Collat​​e 选项在 表级别以及键列的单个字段级别。

    您的外键列上有一个默认值(即 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)”

MySQL创建表:错误1005 errno:150“外键约束形成错误”

Laravel 一般错误:1005 无法创建表

MySQL 添加表时出现“错误 1005”