0
votes

I am trying to run php artisan migrate to create my mysql tables usin laravel.

I got this error: Foreign key constraint is incorrectly formed

Users Table:

Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('street');
            $table->string('city');
            $table->string('phone');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

password_resets table:

Schema::create('password_resets', function (Blueprint $table) {
            $table->string('email')->index();
            $table->string('token');
            $table->timestamp('created_at')->nullable();
        });

products table:

 Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('product_type');
            $table->integer('quantity');
            $table->timestamps();
        });

Shipments table:

  Schema::create('shipments', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('order_number')->unsigned();
        $table->integer('product_id')->unsigned();
        $table->foreign('order_number')->references('id')->on('orders');
        $table->foreign('product_id')->references('id')->on('products');
        $table->dateTime('chargecardtime');
        $table->dateTime('packingtime');
        $table->date('shiporderdate');
        $table->timestamps();
    });

Orders table:

    Schema::create('orders', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('customer_id')->unsigned();
        $table->integer('product_id')->unsigned();
        $table->foreign('customer_id')->references('id')->on('users');
        $table->foreign('product_id')->references('id')->on('products');
        $table->string('name');
        $table->string('to_street');
        $table->string('to_city');
        $table->date('ship_date');  
        $table->string('phone');
        $table->timestamps();
    });

Exception trace:

1 PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table ec.#sql-3664_86 (errno: 150 "Foreign key constraint is incorrectly formed")")

i guess there is a problem with orders table since after error i cant see that table in database.others are created.

3
Which of those statements do fail?Paul Spiegel
i cant see thatdongerpep
i guess there is a problem with orders table since after error i cant see that table in database.others are created.dongerpep

3 Answers

2
votes

Since you're referencing an id you need to make the foreign key column unsigned. As ids are by default unsigned (non-negative).

So do this for all your foreign keys:

$table->integer('product_id')->unsigned();
0
votes

you should add unsigned() method to your foreign keys columns, like $table->integer('product_id')->unsigned() cause they must be exactly the same column types as the key that they are referenced. the referenced keys are probably unsigned integers, that's why you got the error. in MySQL, integer signed and integer unsigned are different types

0
votes

$table->integer('product_id')->unsigned();

try this

$table->unsignedBigInteger(');