我试图在Laravel中创建外键,但是当我使用artisan迁移我的表时,我抛出了以下错误:

[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL
: alter table `priorities` add constraint priorities_user_id_foreign foreign 
key (`user_id`) references `users` (`id`))     

我的迁移代码如下:

优先级迁移文件

public function up()
{
    //
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id');
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
    Schema::drop('priorities');
}

用户迁移文件

public function up()
{
    //
    Schema::table('users', function($table)
    {
    $table->create();
    $table->increments('id');
    $table->string('email');
    $table->string('first_name');
    $table->string('password');
    $table->string('email_code');
    $table->string('time_created');
    $table->string('ip');
    $table->string('confirmed');
    $table->string('user_role');
    $table->string('salt');
    $table->string('last_login');

    $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
        Schemea::drop('users');
}

关于我做错了什么,我现在想要得到这个,因为我有很多表,我需要创建例如用户,客户端,项目,任务,状态,优先级,类型,团队。理想情况下,我想创建表持有这些数据与外键,即clients_project和project_tasks等。

希望有人能帮我开始。


当前回答

如果以上解决方案都不适合新手,检查两个id是否具有相同的类型:都是整数或都是bigInteger,…你可以有这样的东西:

主表(例如用户)

$table->bigIncrements('id');

子表(例如优先级)

$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

此查询将失败,因为用户。id是一个大整数,而优先级。user_id是一个整数。

在这种情况下,正确的查询如下:

$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

其他回答

在自动创建的create_users_table迁移更改$table->id();表- >增加美元(id);。为我做了这个技巧,希望这对你有帮助!

拉拉维尔 ^5.8

从Laravel 5.8开始,迁移存根在ID上使用bigIncrements方法 列。方法创建ID列 增量的方法。 这不会影响项目中的任何现有代码;然而,是 注意外键列必须具有相同的类型。因此,一个 使用increments方法创建的列不能引用列 使用bigIncrements方法创建。 来源:Migrations & bigIncrements


例子

假设您正在构建一个简单的基于角色的应用程序,并且需要在PIVOT表“role_user”中引用user_id。

2019年_05_05_112458_create_users_table.php

// ... public function up() { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('full_name'); $table->string('email'); $table->timestamps(); }); } 2019_05_05_120634_create_role_user_pivot_table.php // ... public function up() { Schema::create('role_user', function (Blueprint $table) { // this line throw QueryException "SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint..." // $table->integer('user_id')->unsigned()->index(); $table->bigInteger('user_id')->unsigned()->index(); // this is working $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }); } As you can see, the commented line will throw a query exception, because, as mentioned in the upgrade notes, foreign key columns must be of the same type, therefore you need to either change the foreing key (in this example it's user_id) to bigInteger in role_user table or change bigIncrements method to increments method in users table and use the commented line in the pivot table, it's up to you. I hope i was able to clarify this issue to you.

在我的例子中,我引用了字符串user_id列上的整数id列。我改变了:

表- >字符串(“user_id”)

to:

表- >美元整数(user_id) - >无符号();

希望它能帮助到一些人!

你应该这样写

public function up()
{
    Schema::create('transactions', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->float('amount', 11, 2);
        $table->enum('transaction type', ['debit', 'credit']);
        $table->bigInteger('customer_id')->unsigned();      
        $table->timestamps();                 
    });

    Schema::table('transactions', function($table) {
        $table->foreign('customer_id')
              ->references('id')->on('customers')
              ->onDelete('cascade');
    });     
}

外键字段应不签名,希望对您有帮助!!

其要点是,外部方法使用ALTER_TABLE将一个预先存在的字段转换为外键。所以在应用外键之前必须定义表类型。但是,它不必在单独的Schema::调用中。你可以在create中做这两件事,像这样:

public function up()
{
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
}

还要注意,user_id的类型被设置为unsigned以匹配外键。