راکت
حل شده

errno 150 Foreign key constraint is incorrectly formed

12 پاسخ

سلام @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']);
        });
    }
ثبت پرسش جدید

پاسخ‌ها

12
mahdi mehrabi
mahdi mehrabi
@mahdimehrabi17
بهترین پاسخ

@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
mahdi mehrabi
@mahdimehrabi17

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

            $table->unsignedBigInteger('role_id');

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

سینا خوشدل
سینا خوشدل
@sinakhoshdel

تخصص: برنامه نویس وب

@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

تخصص: طراح و برنامه نویس

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

سینا خوشدل
سینا خوشدل
@sinakhoshdel

تخصص: برنامه نویس وب

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

حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

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

سینا خوشدل
سینا خوشدل
@sinakhoshdel

تخصص: برنامه نویس وب

@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

تخصص: طراح و برنامه نویس

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

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

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

حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

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

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

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

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

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

Schema::enableForeignKeyConstraints();
سینا خوشدل
سینا خوشدل
@sinakhoshdel

تخصص: برنامه نویس وب

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

ftp
ftp
@ftp

تخصص: ساده

@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 تا موضوع بود که ازش این ارور گرفته میشد ( در کل هر 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 توش نبود

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

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