【发布时间】:2016-06-04 17:31:18
【问题描述】:
我遇到了一个让我非常困惑的外键问题。我在运行迁移时遇到的具体错误是:
SQLSTATE[HY000]: 一般错误: 1215 无法添加外键约束 (SQL: alter table
productsadd 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