问题描述
我试图创建一个外键,但是它不起作用。
帖子迁移
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePostsTable extends Migration
{
public function up()
{
Schema::create('posts',function (Blueprint $table) {
$table->id();
$table->string("title",60);
$table->string("description",200);
$table->text("content");
$table->string("photo");
$table->unsignedBigInteger('user_id');
$table->timestamps();
$table->foreign("user_id")->references("id")
->on("users")->onDelete("cascade");
});
}
public function down()
{
Schema::dropIfExists('posts');
}
}
用户迁移
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class createusersTable extends Migration
{
public function up()
{
Schema::create('users',function (Blueprint $table) {
$table->id();
$table->string("name",30);
$table->string("email")->unique();
$table->string("password");
$table->string("username")->unique();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
}
我正在尝试为应该通过外键与用户 ID 连接的帖子创建一个“user_id”列。但是,当我迁移时,我收到如下错误
Illuminate\Database\QueryException
sqlSTATE[HY000]:一般错误:1005 无法创建表
mytest_db
.posts
(errno: 150 "外键约束不正确
形成”)(sql:alter table posts
添加约束
posts_user_id_foreign
外键 (user_id
) 引用 users
(id
) 删除级联)
在 W:\domains\mytest.uz\vendor\laravel\framework\src\Illuminate\Database\Connection.PHP:678 674▕ // 如果尝试运行查询时发生异常,我们将格式化错误 675▕ // 包含与 sql 的绑定的消息,这将使此异常成为 676▕ // 对开发人员更有帮助,而不仅仅是数据库的错误。 677▕ catch (Exception $e) { ➜ 678▕ throw new QueryException( 679▕ $query,$this->prepareBindings($bindings),$e 680▕); 第681话 682▕
1
W:\domains\mytest.uz\vendor\laravel\framework\src\Illuminate\Database\Connection.PHP:471
PDOException::("sqlSTATE[HY000]: General error: 1005 Can't create table mytest_db
.posts
(errno: 150 "Foreign key constraint
格式不正确")")
2
W:\domains\mytest.uz\vendor\laravel\framework\src\Illuminate\Database\Connection.PHP:471
PDOStatement::execute()
解决方法
不能在尚不存在的表上定义外键。
Laravel 按文件名顺序执行迁移,在迁移名称前加上时间戳。
确保 CreatePostsTable
迁移在CreateUsersTable
的迁移之后。