【问题标题】:MySQL Foreign Key - Cannot Resolve Table Name Close TOMySQL外键 - 无法解析表名关闭到
【发布时间】:2016-06-04 17:31:18
【问题描述】:

我遇到了一个让我非常困惑的外键问题。我在运行迁移时遇到的具体错误是:

SQLSTATE[HY000]: 一般错误: 1215 无法添加外键约束 (SQL: alter table products add constraint products_provider_id_foreign foreign k ey (provider_id) 在删除级联时引用 id (providers)

Latest Foreign Key Error下的MySQLSHOW ENGINE INNODB STATUS;结果为:

2016-02-22 21:38:17 11debc000 表 testdb/#sql-186_18db 的外键约束错误: 删除级联时外键 (provider_id) 引用 id (providers): 无法解析接近的表名: (providers) 删除级联

我已经检查了以下所有内容:

  • 相同的数据类型:int
  • 数据长度相同:10
  • 相同的签名:unsigned
  • 目标表是一个键:primary
  • 两个表都正确引擎:INNODB
  • 两个表相同的字符集:utf8
  • 两个表相同的排序规则:utf8

第一个表是providers,主键id定义为INT(10),无符号:

第二个表是products,有一个名为provider_id 的列定义为INT(10),并且是无符号的。

这个错误当然是有据可查的,尤其是在 SO 上,但没有一个常见的东西 (including this checklist) 起作用。有没有人看到这里有什么问题或者有什么其他建议?

不管怎样,我的系统:

  • OSX 10.8.5
  • MySQL 5.6.11
  • 迁移在 Laravel 5.2 中(但怀疑这与问题有关)

编辑

Laravel 迁移添加外键的相关部分是:

Schema::table('products', function (Blueprint $table) {
    $table->foreign('provider_id')->references('providers')->on('id')->onDelete('cascade');
    $table->foreign('brand_id')->references('brands')->on('id')->onDelete('cascade');
});

products 表的创建是这样开始的:

public function up()
{
    Schema::create('products', function(Blueprint $table) {
        $table->increments('id');
        $table->integer('provider_id')->unsigned();

供应商迁移的相关部分是:

public function up()
{
    Schema::create('providers', function(Blueprint $table) {
        $table->increments('id');

我最初使用 Schema::create(...) 来创建表的外键部分,但当它不起作用时,我尝试在创建之后 让它来,以防由于某种原因它不是正确构建迁移。

【问题讨论】:

  • 您能否发布您对产品和提供商的迁移?
  • 语法有点落后。它必须是REFERENCES table (column),但你有REFERENCES column (table)。应该是REFERENCES providers (id)。 Laravel 是否创建了这种语法?
  • @JeremyHarris:您是否在迁移中添加了$table->integer('provider_id')->unsinged();$table->integer('brand_id')->unsigned();
  • @JilsonThomas 我添加了迁移代码的相关sn-ps。

标签: mysql laravel foreign-keys


【解决方案1】:

改变这个:

Schema::table('products', function (Blueprint $table) {
    $table->foreign('provider_id')->references('providers')->on('id')->onDelete('cascade');
    $table->foreign('brand_id')->references('brands')->on('id')->onDelete('cascade');
});

Schema::table('products', function (Blueprint $table) {
    $table->foreign('provider_id')->references('id')->on('providers')->onDelete('cascade');
    $table->foreign('brand_id')->references('id')->on('brands')->onDelete('cascade');
});

您已经交换了列名和表格的位置。

【讨论】:

  • 哈。那应该是我放弃它过夜的暗示。感谢您发现!
  • 难以置信。在过去的几个小时里,这个问题一直困扰着我,我想我已经检查了我所有的表属性无数次。这很容易被忽视,我很高兴我找到了这个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2018-08-04
  • 2022-01-04
相关资源
最近更新 更多