SQLSTATE[HY000]: General error: 1 unknown column "user_id" in foreign key definition
SQLSTATE[HY000]: General error: 1 unknown column "user_id" in foreign key definition
当我 运行 :
时出现此错误
php artisan migrate:fresh
Illuminate\Database\QueryException : SQLSTATE[HY000]: General
error: 1 unknown column "user_id" in foreign key definition (SQL:
create table "users" ("id" integer not null primary key autoincrement,
"name" varchar not null, "email" varchar not null, "username" varchar
not null, "email_verified_at" datetime null, "password" varchar not
null, "remember_token" varchar null, "created_at" datetime null,
"updated_at" datetime null, foreign key("user_id") references
"users"("id") on delete cascade))
我在youtube上关注一个视频教程,教程的代码是这样的:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateProfilesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('profiles');
}
}
如果我复制并粘贴此代码,则会出现错误。所以我在 Whosebug 上搜索并找到了这个解决方案:
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
Schema::table('profiles', function (Blueprint $table){
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('profiles');
}
这是我的用户 table:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->string('username')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('users');
}
但是今天,当我 运行 php artisan migrate:fresh
我又遇到了这个错误。
我该如何解决?
谢谢
错误在这里说得很清楚:
foreign key("user_id") references "users"("id") on delete cascade)
并且您没有名称为 user_id
的列
语法是:
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns) <-- this must be a column in the table
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
但在您的情况下 user_id
列在查询中不可用。因此,要么添加该列,要么删除该约束代码,然后重试。
此问题的原因是配置文件 table 是在用户 table 之前创建的。
我有解决问题的窍门。
您应该重命名迁移目录中的迁移文件。
例如让我的文件名是这样的
- 2019_06_10_000001_create_users_table.php
- 2019_06_10_000002_create_profiles_table.php
第一个用户 table 是在您 运行 "artisan migrate or migrate:fresh"
时创建的
为什么?因为第一个创建的迁移文件是用户 file.You 应该仔细看
- 2019_06_10_000001 -> 用户 table 姓名
- 2019_06_10_000002 -> 配置文件 table 名称
解法:
所以你只需要这样做:重命名 "user" table 并将其命名为小于 "profiles" table.So 问题将解决的数字。
其他解决方案:
运行 分别删除此命令后的所有迁移文件。
php artisan make:migration create_users_table
php artisan make:migration create_profiles_table
试试这个;
public function up()
{
Schema::dropIfExists('profiles');
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
}
那就是迁移。在你能够 运行 之前;在迁移 table.
中删除 'CreateProfilesTable' 的行
正如其他人所提到的,user_id
不是您的 users
table 中的列,但您正试图在其上创建索引。这一行:
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
属于 profiles
table 创建模式,而不属于 users
table 创建模式。
完整代码:
// create_users_table.php
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->string('username')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
// create_profiles_table.php <-- migrate AFTER users table
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
当我 运行 :
时出现此错误php artisan migrate:fresh
Illuminate\Database\QueryException : SQLSTATE[HY000]: General error: 1 unknown column "user_id" in foreign key definition (SQL: create table "users" ("id" integer not null primary key autoincrement, "name" varchar not null, "email" varchar not null, "username" varchar not null, "email_verified_at" datetime null, "password" varchar not null, "remember_token" varchar null, "created_at" datetime null, "updated_at" datetime null, foreign key("user_id") references "users"("id") on delete cascade))
我在youtube上关注一个视频教程,教程的代码是这样的:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateProfilesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('profiles');
}
}
如果我复制并粘贴此代码,则会出现错误。所以我在 Whosebug 上搜索并找到了这个解决方案:
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
Schema::table('profiles', function (Blueprint $table){
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('profiles');
}
这是我的用户 table:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->string('username')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('users');
}
但是今天,当我 运行 php artisan migrate:fresh
我又遇到了这个错误。
我该如何解决?
谢谢
错误在这里说得很清楚:
foreign key("user_id") references "users"("id") on delete cascade)
并且您没有名称为 user_id
语法是:
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns) <-- this must be a column in the table
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
但在您的情况下 user_id
列在查询中不可用。因此,要么添加该列,要么删除该约束代码,然后重试。
此问题的原因是配置文件 table 是在用户 table 之前创建的。 我有解决问题的窍门。
您应该重命名迁移目录中的迁移文件。
例如让我的文件名是这样的
- 2019_06_10_000001_create_users_table.php
- 2019_06_10_000002_create_profiles_table.php
第一个用户 table 是在您 运行 "artisan migrate or migrate:fresh"
时创建的为什么?因为第一个创建的迁移文件是用户 file.You 应该仔细看
- 2019_06_10_000001 -> 用户 table 姓名
- 2019_06_10_000002 -> 配置文件 table 名称
解法: 所以你只需要这样做:重命名 "user" table 并将其命名为小于 "profiles" table.So 问题将解决的数字。
其他解决方案: 运行 分别删除此命令后的所有迁移文件。
php artisan make:migration create_users_table
php artisan make:migration create_profiles_table
试试这个;
public function up()
{
Schema::dropIfExists('profiles');
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->index('user_id');
});
}
那就是迁移。在你能够 运行 之前;在迁移 table.
中删除 'CreateProfilesTable' 的行正如其他人所提到的,user_id
不是您的 users
table 中的列,但您正试图在其上创建索引。这一行:
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
属于 profiles
table 创建模式,而不属于 users
table 创建模式。
完整代码:
// create_users_table.php
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->string('username')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
// create_profiles_table.php <-- migrate AFTER users table
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('url')->nullable();
$table->string('image')->nullable();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}