繁体   English   中英

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

[英]Error Code: 1005. Can't create table '...' (errno: 150)

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

我想从表 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 和 Collat​​e 选项在表级别以及键列的各个字段级别都相同。
  7. 您的外键列上有一个默认值(即 default=0)
  8. 关系中的字段之一是组合(复合)键的一部分,没有自己的单独索引。 即使该字段有一个索引作为组合键的一部分,您也必须仅为该键字段创建一个单独的索引,以便在约束中使用它。
  9. 您的ALTER语句中有语法错误,或者您在关系中输入了错误的字段名称之一
  10. 您的外键名称超过了 64 个字符的最大长度。

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

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

只需将以下内容添加到您的脚本中:

SET FOREIGN_KEY_CHECKS=0;

它会起作用。

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

有时是由于主表被删除(可能是通过禁用foreign_key_checks),但外键CONSTRAINT在其他表中仍然存在。 我的情况下,我已经删除了表格并试图重新创建它,但它对我来说抛出了同样的错误。

因此,如果有任何表,请尝试从所有表中删除所有外键约束,然后更新或创建表。

错误代码:1005

我有一个类似的问题,所以这里有一些我尝试过的东西(没有任何顺序,除了解决方案:))

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

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

我有一个类似的错误。 问题与子表和父表没有相同的字符集和排序规则有关。 这可以通过附加 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 语句上意味着缺少一些代码。

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

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

相对

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

我想知道为什么 MySQL 不能告诉这样的表不存在......

外键必须与它引用的主键具有完全相同的类型。 例如,类型为“INT UNSIGNED NOT NULL”的前键也​​必须为“INT UNSIGNED 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';

它发生在我的例子中,因为约束声明中引用的表名不正确(我忘记了表名中的大写):

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

刚刚提到了 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 更改一张表的引擎,为我解决了。

检查两个表是否具有相同的模式 InnoDB MyISAM。 在我的案例 InnoDB 中,我将它们全部相同并工作

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM