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

lam*_*eta 99 mysql foreign-keys mysql-error-1005

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

我想从表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 ;
Run Code Online (Sandbox Code Playgroud)

该脚本返回:

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

我尝试在索引表中添加索引:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);
Run Code Online (Sandbox Code Playgroud)

我在两个表(charset和collat​​ion)上检查了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
Run Code Online (Sandbox Code Playgroud)

小智 262

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

通常它是由于参考FK字段不存在.可能是你有错字错误,或检查案例应该是相同的,或者是字段类型不匹配.FK链接的字段必须与定义完全匹配.

一些已知原因可能是:

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

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

  • 问题是外键字符串不匹配.谢谢你的回答. (4认同)
  • `SHOW ENGINE INNODB STATUS`如[本问题]中所述(http://stackoverflow.com/questions/2799021/mysql-error-1005-hy000-cant-create-table-foo-sql-12c-4-errno- 150)帮助我诊断我的特定问题(PEBCAK,在我的情况下......) (4认同)
  • #4是我的问题 - 其中一个表是MyISAM,脚本试图创建一个InnoDB表.当我尝试部署最初运行MySQL 5.0或类似版本的旧系统时,我遇到了这个问题,其中默认存储引擎是MyISAM,脚本运行正常.我当前的环境是5.5,默认存储是InnoDB.在脚本开头添加`set names'utf8',storage_engine = MYISAM;`为我解决了这个问题.感谢@ user319198和@Stefano的精心解答!:O) (3认同)

hap*_*dik 11

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

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

SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)

它应该工作.


小智 5

有时是由于主表被删除(可能是通过禁用foreign_key_checks),但外键CONSTRAINT仍然存在于其他表中。就而言,我删除了该表并尝试重新创建它,但它为我抛出了相同的错误。

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