【问题标题】:mysql cannot create table - error 1005mysql 无法创建表 - 错误 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) 既不是长度定义,也不是对您可以在列中存储的内容的限制。这是一个提示,提示客户端应用程序应该显示列的宽度。

标签: mysql sql create-table mysql-error-1005


【解决方案1】:

错误代码:1005 -- 您的代码中的主键引用错误

通常是因为引用 FK 字段不存在。可能是您有拼写错误,或者检查大小写应该相同,或者字段类型不匹配。 FK 链接的字段必须与定义完全匹配。

第一步:

如果您在服务器上拥有管理员权限,您可能希望在收到错误后立即运行 MySQL 命令“SHOW INNODB STATUS”(或 MySQL 5.5“SHOW ENGINE INNODB STATUS”)。此命令显示日志信息和错误详细信息。

如果您的脚本在一台服务器上运行良好,但当您尝试在另一台服务器上运行时出现错误,则很有可能#6 是问题所在。不同版本的 MySQL 有不同的默认字符集设置,您可能在不知情的情况下在不同的服务器上分配了不同的字符集。

一些已知原因可能是:

  1. 两个关键字段类型和/或大小不完全匹配。为了 例如,如果一个是 INT(10),则关键字段也需要是 INT(10) 而不是 INT(11) 或 TINYINT。您可能需要确认字段大小 使用 SHOW CREATE TABLE 因为查询浏览器有时会在视觉上 只显示 INT(10) 和 INT(11) 的 INTEGER。您还应该检查 一个未签名,另一个未签名。他们都需要 完全一样。
  2. 您尝试引用的关键字段之一没有 索引和/或不是主键。如果在 关系不是主键,您必须为此创建一个索引 字段。
  3. 外键名称是现有键的副本。 检查您的外键名称在您的数据库中是唯一的。 只需在密钥名称的末尾添加几个随机字符即可进行测试 为此。
  4. 您的一个或两个表是 MyISAM 表。为了使用 外键,表必须都是 InnoDB。 (实际上,如果两个表 是 MyISAM,那么您将不会收到错误消息 - 它只是不会创建 键。)在查询浏览器中,您可以指定表类型。
  5. 您已在 DELETE SET NULL 上指定了级联,但相关的 关键字段设置为 NOT NULL。您可以通过更改您的 级联或设置字段以允许 NULL 值。

  6. 确保 Charset 和 Collat​​e 选项在 表级别以及键列的单个字段级别。

  7. 您的外键列上有一个默认值(即 default=0)

  8. 关系中的一个字段是组合的一部分 (复合)键并且没有它自己的单独索引。甚至 尽管该字段有一个索引作为复合键的一部分,但您必须 仅为该键字段创建单独的索引,以便在 约束。

  9. 您的 ALTER 语句中有语法错误,或者您有 错误输入了关系中的字段名称之一

    10 您的外键名称超过了 64 个字符的最大长度。

更多详情请参考:MySQL Error Number 1005 Can’t create table

【讨论】:

    【解决方案2】:

    这个:

    FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)
    

    只有在你有的时候才有效

    1. 该客户(P_ID)字段的索引,因此您应该添加一个
    2. 使用 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为外键之前,必须先声明为主键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-22
      • 2016-02-11
      • 2019-06-14
      • 2013-03-30
      • 2020-04-10
      • 1970-01-01
      • 2010-11-03
      • 2016-07-26
      相关资源
      最近更新 更多