错误代码:1005。无法创建表"..."(错误: 150)



我在互联网上搜索了这个问题的解决方案,并检查了Stack 问题太多了,但没有一个解决方案适用于我的案例。

我想创建一个从表sira_no到metal_kod的外键。

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

此脚本返回:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

我尝试在引用的表中添加一个索引:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

我在两个表(字符集和排序规则)上都检查了METAL_KODU,但找不到解决这个问题的方法。如何解决此问题?

这是metal_kod表:

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100

错误代码:1005——代码中存在错误的主键引用

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

一些已知的原因可能是:

  1. 两个关键字字段的类型和/或大小不完全匹配。例如,如果一个是INT(10),则密钥字段也需要是INT,而不是BIGINTSMALLINTTINYINT。您还应该检查一个不是SIGNED,另一个是UNSIGNED。它们必须完全相同
  2. 您试图引用的某个键字段没有索引和/或不是主键。如果关系中的某个字段不是主键,则必须为该字段创建索引
  3. 外键名称与已存在的密钥重复。请检查您的外键名称在数据库中是否唯一。只需在密钥名称的末尾添加几个随机字符即可测试这一点
  4. 您的一个或两个表都是MyISAM表。为了使用外键,这两个表都必须是InnoDB。(实际上,如果两个表都是MyISAM,那么您不会收到错误消息——它只是不会创建键。)在查询浏览器中,您可以指定表类型
  5. 您已指定级联ON DELETE SET NULL,但相关密钥字段设置为NOT NULL。您可以通过更改级联或将字段设置为允许NULL值来解决此问题
  6. 确保Charset和Collate选项在表级别以及键列的单个字段级别都相同
  7. 外键列上有一个默认值(即default=0)
  8. 关系中的一个字段是组合(复合)键的一部分,并且没有自己的单独索引。即使字段有一个索引作为组合键的一部分,也必须仅为该键字段创建一个单独的索引,才能在约束中使用它
  9. 您的ALTER语句中有语法错误,或者您在关系中键入了一个字段名
  10. 外键的名称超过了64个字符的最大长度

有关更多详细信息,请参阅:MySQL错误编号1005无法创建表

将数据库从一台服务器导出到另一台服务器时也可能发生这种情况,默认情况下,表按字母顺序列出
因此,您的第一个表可能具有另一个尚未创建的表的外键。在这种情况下,请禁用foreign_key_checks并创建数据库。

只需在脚本中添加以下内容:

SET FOREIGN_KEY_CHECKS=0;

它会起作用的。

有时是由于主表被删除(可能是通过禁用foreign_key_checks),但外键CONSTRAINT仍然存在于其他表中。在我的案例中,我丢弃了表并试图重新创建它,但它给我带来了同样的错误。

因此,尝试从所有表中删除所有外键CONSTRAINT(如果有的话),然后更新或创建表。

当外键和引用键的类型或长度不相同时,通常会发生这种情况。

我也有类似的错误。这个问题与子表和父表没有相同的字符集和排序规则有关。这可以通过附加ENGINE=InnoDB DEFAULT CHARACTER SET=utf8来修复;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

在SQL语句上,意味着缺少一些代码。

外键必须与它引用的主键具有完全相同的类型。对于类型为"INT UNSIGNED NOT NULL"的示例,外键也必须是"INT UNIGNED NOT NULL"

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';

错误代码:1005

我也遇到过类似的问题,所以下面是我尝试过的一些事情(除了解决方案之外,没有按任何顺序:)

  1. 更改了外键名称(不起作用)
  2. 缩短了外键长度
  3. 验证了数据类型(没有任何错误)
  4. 检查索引
  5. 检查排序规则(一切都很好,又糟透了)
  6. 截断了表,没有什么用处
  7. 已删除表并重新创建
  8. 尝试查看是否正在创建任何循环引用--一切正常
  9. 最后,我看到我有两个编辑器打开了。一个是在PhpStorm(JetBrains)和另一个MySQL工作台中。PhpStorm/MySQL工作台似乎创建了某种编辑锁

    我关闭PhpStorm只是为了检查是否存在锁定(可能是相反的情况)。这解决了我的问题

我收到了同样的错误消息。最后我发现我在命令中拼错了表的名称:

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

我想知道MySQL到底为什么不能告诉这样一个表不存在。。。

MyISAM刚刚提到。只需尝试添加ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2,假设您的其他表是用MyISAM创建的。

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

在我的例子中,当一个表是InnoB,另一个是MyISAM时,就会发生这种情况。通过MySQL Workbench更改一个表的引擎,为我解决了问题。

在我的情况下发生了这种情况,因为约束声明中引用的表的名称不正确(我忘记了表名称中的大写):

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

检查两个表是否具有相同的模式InnoDB MyISAM。在我的案例中,InnoDB和都是一样的

我的问题没有列出,这太愚蠢了。。。。。以FK作为PK的表是一个复合PK,声明如下:主键(CNPJCEP)我希望CEP字段是另一个表中的FK,但我陷入了这个错误,故事的寓意只是颠倒了上面主键(CEPCNPJ)的代码,它成功了。给他们的朋友小费。

最新更新