errno 150 Foreign key constraint is incorrectly formed

- 4 هفته پیش
توسط سینا خوشدل آپدیت شد
سینا خوشدل ( 132 تجربه )
4 هفته پیش
تخصص : برنامه نویس وب

سلام @hesammousavi
اررور زیر رو می گیرم وقتی می خوام جداول زیر رو درست کنم
roles , permissions و جدول میانی permission_role و جدول میانی role_user

ارور:
(errno: ۱۵۰ "Foreign key constraint is incorrectly formed") (SQL: alter table `permission_role` add constraint `permission_role_permission_id_foreign` foreign key (`permission_id`) references `permissions` (`id`) on delete cascade)

کد مایگریشن من:

 public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('label')->nullable();
            $table->timestamps();
        });

        Schema::create('permissions', function (Blueprint $table) {
                $table->bigIncrements('id');
                $table->string('name');
                $table->string('label')->nullable();
                $table->timestamps();
        });

        Schema::create('permission_role', function (Blueprint $table) {
            $table->integer('permission_id')->unsigned();
            $table->integer('role_id')->unsigned();
            $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->primary(['permission_id','role_id']);
        });

        Schema::create('role_user', function (Blueprint $table) {
            $table->unsignedInteger('role_id');
            $table->unsignedInteger('user_id');
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

            $table->primary(['role_id','user_id']);
        });
    }
بهترین پاسخ انتخاب شده توسط سینا خوشدل
mahdi mehrabi
4 هفته پیش

@sinakhoshdel
از این کد استفاده کنید

    Schema::create('roles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('label')->nullable();
            $table->timestamps();
        });
        Schema::create('permessions', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('label')->nullable();
            $table->timestamps();
        });

        Schema::create('permession_role', function (Blueprint $table) {
            $table->bigInteger('permession_id')->unsigned();
            $table->bigInteger('role_id')->unsigned();
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->foreign('permession_id')->references('id')->on('permessions')->onDelete('cascade');
            $table->primary(['role_id', 'permession_id']);
        });

        Schema::create('role_user', function (Blueprint $table) {
            $table->bigInteger('user_id')->unsigned();
            $table->bigInteger('role_id')->unsigned();
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->primary(['role_id', 'user_id']);
        });
mahdi mehrabi ( 4015 تجربه )
4 هفته پیش

سلام به این دلیل این مشکل به وجود اومده که شما از bigIncrements استفاده کردی برای id ها و خواستی یک integer رو به یک bigInteger وصل کنی که نمیشه ستون هایی که کلیدی خارجی هستند رو به این صورت تعریف کن

            $table->unsignedBigInteger('role_id');

یا میتونی bigInteger اشون کنی و بعد اتریبیوت usigned() رو بهشون بدی

سینا خوشدل ( 132 تجربه )
4 هفته پیش
تخصص : برنامه نویس وب

@mahdimehrabi17 سلام ممنون از جوابت این کارو کردم هم با unsignedInteger ,و هم با bigInteger اما هنوز همون ارور رو میگیرم

F:\xampp\htdocs\awesome>php artisan migrate
Migrating: 2019_06_23_013909_create_roles_table

   Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1005 Can't create table `awesome`.`#sql-670_1e3` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `permission_role` add constraint `permission_role_permission_id_foreign` foreign key (`permission_id`) references `permissions` (`id`) on delete cascade)

  at F:\xampp\htdocs\awesome\vendor\laravel\framework\src\Illuminate\Database\Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table `awesome`.`#sql-670_1e3` (errno: 150 "Foreign key constraint is incorrectly formed")")
      F:\xampp\htdocs\awesome\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458

  2   PDOStatement::execute()
      F:\xampp\htdocs\awesome\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458

  Please use the argument -v to see more details.
حسام موسوی ( 142294 تجربه )
4 هفته پیش
تخصص : طراح و برنامه نویس

سلام ارور شما میگه جدول awesome رو نمی تونه بوجود بیاره .
مایگریشن awesome شما چی داره ؟

سینا خوشدل ( 132 تجربه )
4 هفته پیش
تخصص : برنامه نویس وب

سلام استاد موسوی
@hesammousavi
نه اسم دیتابیس من awesome هستش
مشکل در ساخت جداول میانی هست
من دقیقا همون کارایی که شما در قسمت اول ACL دوره لاراول انجام دادینو کردم
خیلی سرچ کردم اما چیزی پیدا نشد
من از لاراول ۵.۸ استفاده میکنم

حسام موسوی ( 142294 تجربه )
4 هفته پیش
تخصص : طراح و برنامه نویس

ورژن mysql شما چند هست ؟

سینا خوشدل ( 132 تجربه )
4 هفته پیش
تخصص : برنامه نویس وب

@hesammousavi من از آخرین ورژن زمپ استفاده میکنم

Apache 2.4.39,
 MariaDB 10.3.16,
 PHP 7.3.6, 
phpMyAdmin 4.9.0.1,
 OpenSSL 1.1.1,
 XAMPP Control Panel 3.2.4, 
Webalizer 2.23-04,
 Mercury Mail Transport System 4.63,
 FileZilla FTP Server 0.9.41,
 Tomcat 7.0.92 (with mod_proxy_ajp as connector), 
Strawberry Perl 5.16.3.1 Portable
حسام موسوی ( 142294 تجربه )
4 هفته پیش
تخصص : طراح و برنامه نویس

این خط از permission_role رو بردارید و دوباره تست کنید

$table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');

ببینید ایا کلید role_id هم ارور میده
ارور مربوطه شما مربوط به لینک زیر میشه که محتواش در لاراول هم هست
https://laravel.com/docs/5.8/migrations#foreign-key-constraints

mahdi mehrabi ( 4015 تجربه )
4 هفته پیش

@sinakhoshdel
از این کد استفاده کنید

    Schema::create('roles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('label')->nullable();
            $table->timestamps();
        });
        Schema::create('permessions', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('label')->nullable();
            $table->timestamps();
        });

        Schema::create('permession_role', function (Blueprint $table) {
            $table->bigInteger('permession_id')->unsigned();
            $table->bigInteger('role_id')->unsigned();
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->foreign('permession_id')->references('id')->on('permessions')->onDelete('cascade');
            $table->primary(['role_id', 'permession_id']);
        });

        Schema::create('role_user', function (Blueprint $table) {
            $table->bigInteger('user_id')->unsigned();
            $table->bigInteger('role_id')->unsigned();
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->primary(['role_id', 'user_id']);
        });
حسام موسوی ( 142294 تجربه )
4 هفته پیش
تخصص : طراح و برنامه نویس

طبق توضیحات گفته شده که به جای کد زیر

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

باید اینطوری بنویسید

      $table->unsignedBigInteger('permission_id');
      $table->unsignedBigInteger('role_id');

البته با کد زیر هم میتونید اطمینان حاصل کنید که foreign key constraints فعاله

Schema::enableForeignKeyConstraints();
سینا خوشدل ( 132 تجربه )
4 هفته پیش
تخصص : برنامه نویس وب

ممنونم ازتون دوستان مشکل حل شد
@hesammousavi
@mahdimehrabi17

برای ارسال پاسخ باید وارد سایت شوید