150 "Foreign key constraint is incorrectly formed"

150 "Foreign key constraint is incorrectly formed"

我在迁移 table 时遇到问题。

我有一个用户 table,它有一个字符串 ID,并且 table 是在 SQL 之前创建的,没有迁移。

稍后,我使用以下代码创建了一个名为 surveys 的 table,它具有指向 user_id 的外键。

hema::create('surveys', function (Blueprint $table) {
            $table->increments('id');
            $table->string('user_id',40);
            $table->foreign('user_id')->references('id')->on('users') ->onUpdate('cascade')->onDelete('cascade');
            $table->string('gender');
            $table->string('age');
            $table->string('education');
            $table->string('proficiency');
            $table->string('behaviour');
            $table->timestamps();
        });

每当我尝试迁移它时,我总是收到以下错误,我不知道为什么会这样。 table 用户中的 id 是 varchar 40,user_id.

也是

  SQLSTATE[HY000]: General error: 1005 Can't create table `d0372341`.`surveys` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `surveys` add constraint `surveys_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete cascade on update cascade)

  at D:\xampp install\htdocs\game-db\vendor\laravel\framework\src\Illuminate\Database\Connection.php:692
    688▕         // If an exception occurs when attempting to run a query, we'll format the error
    689▕         // message to include the bindings with SQL, which will make this exception a
    690▕         // lot more helpful to the developer instead of just the database's errors.
    691▕         catch (Exception $e) {
  ➜ 692▕             throw new QueryException(
    693▕                 $query, $this->prepareBindings($bindings), $e
    694▕             );
    695▕         }
    696▕     }

所以,如果你能帮我解决这个问题,我将不胜感激。

$table->string('user_id',40);更改为$table->unsignedBigInteger('user_id)

或者如果你使用 Laravel 8.x 你基本上可以做到

$table->foreignId("user_id")->constrained()->cascaseOnDelete();

然后运行这个命令

php artisan migrate:refresh

编辑:

确保您的用户 table 中的主键是字符串,然后更新您的用户模型

public $incrementing = false;
protected $keyType = 'string';

https://laravel.com/docs/8.x/eloquent#primary-keys

所以我post这里的回答是为了帮助别人: (ps。别忘了将此答案标记为最佳答案)

在您的 users table 中,确认您的 id 字段的排序规则是 utf8mb4_unicode_ci。错误有时可能是由于此。