【问题标题】:MySQL engine=InnoDB error 1005 errno 150MySQL 引擎=InnoDB 错误 1005 errno 150
【发布时间】:2014-02-28 19:33:59
【问题描述】:

我正在创建一个小型数据库,以便掌握 MySQL 和 SQL 的一般知识。

我不确定我做错了什么,但我想我会发布我的代码,以防万一问题是我没有抓住的语法问题。

CREATE TABLE student(
       ID varchar(5) NOT NULL, 
       name varchar(20) NOT NULL, 
       dept_name varchar(20), 
       tot_cred numeric(3,0), 
  PRIMARY KEY(ID), 
  FOREIGN KEY(dept_name) 
    REFERENCES department 
  ON UPDATE CASCADE 
  ON DELETE CASCADE) 
ENGINE = InnoDB;

我已经创建了包含 dept_name 主键的“部门”表。在使用外键约束时,我尝试在不使用 ENGINE=InnoDB 的情况下继续,但显然 - 不成功。

有人可以向我解释为什么 MySQL 向我抛出错误 1005 errno 150 以及我应该如何使用最简单的术语来解决它?

【问题讨论】:

  • 它引用了“部门”中的哪一列?是否与“ID”具有相同的数据类型?
  • 在您的外键更改对引用部门(id)的引用

标签: mysql foreign-keys innodb


【解决方案1】:

确保您遵守此语法...

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (
    id INT, 
    parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id) 
        REFERENCES parent(id)
        ON DELETE CASCADE
) ENGINE=INNODB;

确保你的数据类型在 fk 上是相同的......并且你必须说出它在另一个表中引用的列

【讨论】:

  • 那么始终包含父表的 ENGINE=InnoDB 以及引用它的子表是否被认为是一种好习惯?
  • 在 MyIsam 上使用 InnoDB 总是一个好习惯,因为 MyIsam 根本不支持外键约束...
  • 如果我需要全文索引,我只使用 myisam,我使用的版本不支持 innodb 上的全文索引(不确定它是否真的受支持)。 INNODB 是支持事务型数据库的最佳选择
【解决方案2】:

来自 mysql 文档:

1005 (ER_CANT_CREATE_TABLE)

Cannot create table. If the error message refers to error 150, table creation failed because a foreign key constraint was not correctly formed. If the error message refers to error –1, table creation probably failed because the table includes a column name that matched the name of an internal InnoDB table.

当使用REFERENCES 时,您应该同时指定被引用的表和表中被引用的行:

示例:

参考部门(id)

另外,出于性能原因,建议使用数值作为外键。

【讨论】:

    【解决方案3】:

    我刚遇到这个问题。我的解决方案是确保我引用的字段的整数类型都是 UNSIGNED。如果一个已签名而另一个未签名,您将收到此错误。

    如果您想要负数,那么只需确保两者都已签名,但您很可能需要未签名。关键是它们必须是相同的类型。

    因此,如果您要引用另一个表中的主键,请确保该主键是 UNSIGNED Integer 类型。

    然后,当您创建外键时,请确保您创建它的列也是 UNSIGNED Integer 类型。

    【讨论】:

    • 嗯,这很有趣,我一定会记住的。我在这里遇到的问题实际上是通过根据 MySQL 语法正确编写外键来解决的:FOREIGN KEY(attribute) REFERENCES table_name(attribute)
    猜你喜欢
    • 2018-04-14
    • 2016-07-27
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多