سینا خوشدل
5 سال پیش توسط سینا خوشدل مطرح شد
12 پاسخ

errno 150 Foreign key constraint is incorrectly formed

سلام @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
@mahdimehrabi17 5 سال پیش مطرح شد
1

@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
@mahdimehrabi17 5 سال پیش مطرح شد
3

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

            $table->unsignedBigInteger('role_id');

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


سینا خوشدل
تخصص : برنامه نویس وب
@sinakhoshdel 5 سال پیش مطرح شد
0

@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.

حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
0

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


سینا خوشدل
تخصص : برنامه نویس وب
@sinakhoshdel 5 سال پیش مطرح شد
0

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


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
1

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


سینا خوشدل
تخصص : برنامه نویس وب
@sinakhoshdel 5 سال پیش مطرح شد
0

@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

حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش آپدیت شد
2

این خط از 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
@mahdimehrabi17 5 سال پیش مطرح شد
1

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

حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
3

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

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

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

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

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

Schema::enableForeignKeyConstraints();

سینا خوشدل
تخصص : برنامه نویس وب
@sinakhoshdel 5 سال پیش مطرح شد
0

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


ftp
تخصص : ساده
@ftp 4 سال پیش مطرح شد
0

@juza66
@ali.bayat
@sinakhoshdel
من این کار ها رو انجام دادم نشد
جدول من اینه

 Schema::create('table_article', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->string('title',100);
            $table->string('discription',100);
            $table->unsignedBigInteger('category_id');
            $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
            $table->unsignedBigInteger('image_id');
           // $table->foreign('image_id')->references('id')->on('images')->onDelete('cascade');
            $table->string('type')->nullable();
            $table->unsignedBigInteger('Weight_id');//برچسب میباشد
           // $table->foreign('weight_id')->references('id')->on('weight')->onDelete('cascade');
            $table->integer('price');
            $table->string('color');
            $table->timestamps();
        });

اما این ارور رو میده

SQLSTATE[HY000]: General error: 1005 Can't create table `proj`.`#sql-1096_64` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `table_article` add constraint `table_article_category_id_foreign` foreign key (`category_id`) references `categories` (`id`) on delete cascade)

میشه راهنمایی کنید


عباس
تخصص : برنامه نویس
@AbbasA46 3 سال پیش آپدیت شد
2

سلام دوستان
--------------------------------------- شاید به درد کسی بخوره ------------------------------

منم به این ارور بر خوردم و واسه من 3 تا موضوع بود که ازش این ارور گرفته میشد ( در کل هر 3 مربوط به کلید خارجی بودن )

1. ترتیب ایجاد جدول هایی ( مایگریشن هایی ) که داشتم با کلید خارجی هایی که ایجاد کرده بودم نمیخوند
نکته: ترتیب ایجاد جدول ها و مایگریشن ها و زمان معرفی کلید خارجی ها مهمه
یعنی چی: یعنی اینکه مثلا من اول مایگریشن ( جدول ) user رو داشتم و داخلش کلید خارجی که به مایگریشن ( جدول ) role اشاره کرده بود رو نوشتم و بعد مایگریشن ( جدول ) role رو ساختم =====>>>>> توی اینجا به این گیر داده بود که من هنوز جدول role رو نداشتم و نساخته بودم پس قاعدتا باید هم به کلید خارجی که توی جدول user بود گیر میداد

2. توی جدول میانی ارتباط چند به چند وقتی کلید خارجی تعریف کرده بودم اومده بوده onDelete رو set null قرار داده بودم و به این گیر داده بود البته بعدش خودم هم متوجه شدم که نباید اصلا اینجا onDelete رو set null قرار بدم و باید onDelete رو cascade قرار میدادم

// اشتباه من
// My mistake
$table->foreign('role_id')->references('id')->on('roles')->nullOnDelete();

// درستش
// That's right
$table->foreign('role_id')->references('id')->on('roles')->cascadeOnDelete();

3. و آخرین مورد ==>> این دیگه خیلی ضایع بود
اومده بودم توی کلید خارجی که تعریف کرده بودم رفرنس فیلدی رو داده بودم که وجود نداره
مثلا همین references('name') ولی به جدولی که اشاره کرده بودم اصلا فیلد name توش نبود


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام