And*_*w M 32 mysql foreign-keys laravel
基本上,我和这个人有同样的问题,减去表前缀.因为我没有表前缀,他的修复不起作用.http://forums.laravel.com/viewtopic.php?id=972
我正在尝试使用Laravel的Schema Builder构建一个表,如下所示:
Schema::create('lessons', function($table)
{
$table->increments('id');
$table->string('title')->nullable();
$table->string('summary')->nullable();
$table->timestamps();
});
Schema::create('tutorials', function($table)
{
$table->increments('id');
$table->integer('author');
$table->integer('lesson');
$table->string('title')->nullable();
$table->string('summary')->nullable();
$table->string('tagline')->nullable();
$table->text('content')->nullable();
$table->text('attachments')->nullable();
$table->timestamps();
});
Schema::table('tutorials', function($table)
{
$table->foreign('author')->references('id')->on('users');
$table->foreign('lesson')->references('id')->on('lessons');
});
Run Code Online (Sandbox Code Playgroud)
问题是,当我运行此代码(在/ setup路由中)时,我收到以下错误:
SQLSTATE[HY000]: General error: 1005 Can't create table 'tutorials.#sql-2cff_da' (errno: 150)
SQL: ALTER TABLE `tutorials` ADD CONSTRAINT tutorials_author_foreign FOREIGN KEY (`author`) REFERENCES `users` (`id`)
Bindings: array (
)
Run Code Online (Sandbox Code Playgroud)
根据网络上的帖子以及有关如何设置 Laravel的Eloquent关系的有限文档,我不确定我做错了什么...
users已经存在,它确实有一个id字段auto_increment.我也正在建立我的模型与正确的关系(belongs_to和has_many),但据我所知,这不是问题 - 这是数据库设置.数据库是 InnoDB.
我究竟在做什么错误的外键?
maa*_*kle 79
我一直有同样的问题.我刚刚在Laravel Schema文档的最底部注意到以下注释:
注意:外键中引用的字段很可能是自动增量,因此自动为无符号整数.请确保使用unsigned()创建外键字段,因为两个字段必须是完全相同的类型,两个表上的引擎必须设置为InnoDB,并且必须在具有外键的表之前创建引用的表.
对我来说,只要我设置我的外键字段:
$table->integer('author')->unsigned();
Run Code Online (Sandbox Code Playgroud)
我没有问题.
编辑:此外,请确保已创建外表中的字段,否则可能会失败并出现相同的错误.
Dav*_*ker 12
我不是百分之百确定这些是失败的原因,而是几个指针.如果您使用较旧版本的mySQL作为数据库,则默认表实现是myISAM,它不支持外键约束.由于您的脚本在外键分配上失败,因此最好明确指出您希望在Schema的create方法中使用此语法将INNODB作为引擎.
Schema::create('lessons', function($table)
{
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('title')->nullable();
$table->string('summary')->nullable();
$table->timestamps();
});
Run Code Online (Sandbox Code Playgroud)
这应该有望缓解您遇到的问题.
此外,虽然您可以将外键声明为事后补充,但我在初始架构中创建了外键,因为我可以轻松检查以确保我拥有正确的数据库引擎集.
Schema::create('tutorials', function($table)
{
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('author');
$table->integer('lesson');
$table->string('title')->nullable();
$table->string('summary')->nullable();
$table->string('tagline')->nullable();
$table->text('content')->nullable();
$table->text('attachments')->nullable();
$table->timestamps();
$table->foreign('author')->references('id')->on('users');
$table->foreign('lesson')->references('id')->on('lessons');
});
Run Code Online (Sandbox Code Playgroud)
希望这有助于/解决您的问题.
已列出的答案摘要,加上我的:
外键通常需要InnoDb,因此请设置默认引擎,或明确指定
$ table-> engine ='InnoDB';
外键需要引用的表存在.在创建密钥之前,请确保在先前的迁移中创建了引用的表.考虑在单独的迁移中创建密钥以确保.
外键要求数据类型一致.检查引用的字段是否是相同的类型,无论是有符号还是无符号,它的长度是否相同(或更小).
如果要在手动编码迁移和使用生成器之间切换,请确保检查正在使用的ID类型.Artisan 默认使用incrementments(),但Jeffrey Way似乎更喜欢整数('id',true).
我也遇到过这个问题.
我发现的解决方案是,在另一个表可以引用它之前,需要创建包含正在使用外部id的id的表.基本上,您正在创建一个表并告诉MySQL引用另一个表的主键,但该表尚不存在.
在您的示例中,需要首先创建作者和课程表.
创建表的顺序取决于工匠以及您创建迁移文件的顺序.
我的意见是清空所有表的数据库并更改迁移文件名中的时间戳(或删除它们并按正确的顺序重新创建它们),以便在教程表之前创建作者和课程表.
我收到相同的错误,因为我忘记在引用的表上将表类型设置为InnoDB:
$table->engine = 'InnoDB';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37038 次 |
| 最近记录: |