我试图在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等。

希望有人能帮我开始。


当前回答

你可以直接在整型列中传递布尔参数,说它是否应该是无符号的。在laravel 5.4下面的代码解决了我的问题。

        $table->integer('user_id', false, true);

这里第二个参数false表示它不应该是自动递增的,第三个参数true表示它应该是无符号的。可以将外键约束保留在同一迁移中,也可以将其分离。两者都适用。

其他回答

你应该这样写

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');
    });     
}

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

我知道这是一个老问题,但确保如果你使用的是引用,正确的支持引擎是定义的。为两个表设置innodb引擎,为参考列设置相同的数据类型

$table->engine = 'InnoDB';

这么简单!!

如果您第一次创建“priorities”迁移文件,Laravel首先运行“priorities”而“users”表不存在。

它如何向一个不存在的表添加关系!

解决方案:从“优先级”表中取出外键代码。你的迁移文件应该是这样的:

并添加到一个新的迁移文件,这里它的名字是create_prioritiesForeignKey_table,并添加这些代码:

public function up()
{        
    Schema::table('priorities', function (Blueprint $table) {          
        $table->foreign('user_id')
              ->references('id')
              ->on('users');                        
    });
}

上面所有的解决方案都是正确的,但没有一个适合我。

为我创造问题的东西是数据库表引擎。引擎类型已经添加的表是MyISAM和新的迁移正在设置引擎类型= 'InnoDB'

我只是设置引擎类型已经添加表到InnoDB,就是这样!

注意:当Laravel设置一个表使用

$table->increments('id');

这在大多数迁移中是标准的,这将设置一个无符号整数字段。因此,当从另一个表对这个字段进行外部引用时,确保在引用表中,您将字段设置为UnsignedBigInteger,而不是(我假设是一个)UnsignedBigInteger字段。

例如:在迁移文件2018_12_12_123456_create_users_table.php中:

Schema::create('users', function (Blueprint $table){
    $table->increments('id');
    $table->string('name');
    $table->timestamps();

然后在迁移文件2018_12_12_18000000_create_permissions_table.php中,该文件将外部引用设置回用户:

Schema::create('permissions', function (Blueprint $table){
    $table->increments('id');
    $table->UnsignedInteger('user_id'); // UnsignedInteger = "increments" in users table
    $table->boolean('admin');
    $table->boolean('enabled');
    $table->timestamps();

    // set up relationship
    $table->foreign('user_id')->reference('id')->on('users')->onDelete('cascade');
}