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

标签 mysql foreign-keys mysql-error-1005

我在 Internet 上搜索了此问题的解决方案并查看了 StackOverflow 问题,但没有一个解决方案适用于我的案例。

我想创建一个从表 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. 外键名称是现有键的副本。检查您的外键名称在您的数据库中是唯一的。只需在 key 名称的末尾添加几个随机字符即可进行测试。
  4. 您的一个或两个表是 MyISAM 表。为了使用外键,表必须都是InnoDB。 (实际上,如果两个表都是 MyISAM 那么您不会收到错误消息 - 它只是不会创建键。)在查询浏览器中,您可以指定表类型。
  5. 你已经指定了级联ON DELETE SET NULL,但是相关键域设置为 NULL。您可以通过更改级联或将字段设置为允许 NULL 值来解决此问题。
  6. 确保 Charset 和 Collat​​e 选项在表级别以及键列的单个字段级别都相同。
  7. 您的外键列有一个默认值(即 default=0)
  8. 关系中的一个字段是组合(复合)键的一部分,并且没有自己的单独索引。即使该字段有一个索引作为复合键的一部分,您也必须仅为该键字段创建一个单独的索引才能在约束中使用它。
  9. 您的 ALTER 语句中有语法错误,或者您在关系中输入了错误的字段名称之一
  10. 您的外键名称超过了 64 个字符的最大长度。

更多详情请引用: MySQL Error Number 1005 Can’t create table

关于mysql - 错误代码 : 1005. 无法创建表 '...' (errno: 150),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9018584/

相关文章:

mysql - 如何使用 GROUP BY 一次统计新类别和旧类别

mysql - 无法在表名中创建带下划线的表 MySQL v5.5.14

MySQL错误150,无法创建表

python - Django - 获取存储在外键中的对象

php - Yii - 如何在管理页面上通过外键/相关键的列进行搜索?

mysql - 只有 2 个外键的表有什么作用?

mysql - 错误 1005 (HY000) : Can't create table?

php - Mysql连接两个表

mysql - 是否可以从 mysql 选择结果集中选择特定的行索引?

mysql - 使用group_concat后如何计算以 ','分隔的列的长度