![](/img/trans.png)
[英]Resolving Error Code: 1005. Can't create table '' (errno: 150) Error
[英]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 -- 您的代码中有错误的主键引用
通常是由于引用的外键字段不存在。 可能是您有拼写错误,或者检查大小写应该相同,或者字段类型不匹配。 外键链接字段必须完全匹配定义。
一些已知的原因可能是:
INT(10)
键字段也需要是INT
而不是BIGINT
或SMALLINT
或TINYINT
。 您还应该检查一个不是SIGNED
,另一个是UNSIGNED
。 它们都需要完全相同。MyISAM
表。 为了使用外键,表必须都是InnoDB
。 (实际上,如果两个表都是MyISAM
那么您将不会收到错误消息——它只是不会创建键。)在查询浏览器中,您可以指定表类型。ON
DELETE
SET
NULL
,但相关键字段设置为NOT
NULL
。 您可以通过更改级联或将字段设置为允许NULL
值来解决此问题。ALTER
语句中有语法错误,或者您在关系中输入了错误的字段名称之一将数据库从一台服务器导出到另一台服务器时也可能发生这种情况,并且默认情况下表按字母顺序列出。
因此,您的第一个表可能有另一个尚未创建的表的外键。 在这种情况下,禁用foreign_key_checks 并创建数据库。
只需将以下内容添加到您的脚本中:
SET FOREIGN_KEY_CHECKS=0;
它会起作用。
当外键和引用键的类型或长度不同时,经常会发生这种情况。
有时是由于主表被删除(可能是通过禁用foreign_key_checks),但外键CONSTRAINT在其他表中仍然存在。 在我的情况下,我已经删除了表格并试图重新创建它,但它对我来说抛出了同样的错误。
因此,如果有任何表,请尝试从所有表中删除所有外键约束,然后更新或创建表。
错误代码:1005
我有一个类似的问题,所以这里有一些我尝试过的东西(没有任何顺序,除了解决方案:))
最后,我看到我打开了两个编辑器。 一个在 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
,声明如下:主键( CNPJ
, CEP
)我希望 CEP 字段为FK
另一个表,我陷入了这个错误,故事的寓意只是反转了上面的主键( CEP
, CNPJ
)代码并且它起作用了。 给他们的朋友小费。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.