150“外键约束格式不正确”

Posted

技术标签:

【中文标题】150“外键约束格式不正确”【英文标题】:150 "Foreign key constraint is incorrectly formed" 【发布时间】:2021-11-07 20:51:30 【问题描述】:

我在迁移表时遇到问题。

我有一个带有字符串 id 的 users 表,并且该表是之前使用 SQL 创建的,没有迁移。

后来,我创建了一个名为“调查”的表,该表具有 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();
        );

每当我尝试迁移它时,我总是收到以下错误,我不知道为什么会发生这种情况。 users 表中的 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▕     

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

【问题讨论】:

你能把你的 user 表的 schema 放进去吗? 创建表users (idvarchar(40) NOT NULL, achievements text DEFAULT NULL, level int(11) NOT NULL DEFAULT 0, local_rank int(11) NOT NULL DEFAULT 0, money int(11) NOT NULL DEFAULT 0, slant text DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4CREATE TABLE users (id var ) NOT NULL, achievements text DEFAULT NULL, level int(11) NOT NULL DEFAULT 0, local_rank int(11) NOT NULL DEFAULT 0, money int(11) NOT NULL DEFAULT 0, slant text DEFAULT NULL, PRIMARY KEY (id) ENGINE=InnoDB 您是手动创建users 表还是从迁移 创建的?如果是 migration,请修改您的帖子并放入您的 users 表的架构。为了更好地理解并能够帮助到您 在您的 users 表中,验证您的 id 字段的排序规则是 utf8mb4_unicode_ci。错误有时可能是由于这个 非常感谢@Atika,你真的救了我很多爱.....它现在正在工作 【参考方案1】:

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

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

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

然后运行这个命令

php artisan migrate:refresh

编辑:

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

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

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

【讨论】:

我需要 id 是一个字符串,所以我不能更改它并且运行这行代码会给出相同的错误``` $table->foreignId("user_id")->constrained() ->cascaseOnDelete(); ``` 同样的问题仍然存在【参考方案2】:

所以我在这里发布答案以帮助其他人: (ps.不要忘记将此答案标记为最佳答案)

在您的users 表中,验证您的id 字段的排序规则是utf8mb4_unicode_ci。错误有时可能是由于这个原因。

【讨论】:

以上是关于150“外键约束格式不正确”的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 迁移错误:150“外键约束格式不正确”

Laravel 迁移错误号:150“外键约束格式不正确”

Laravel 迁移:Errcode:150“外键约束格式不正确”

一般错误:1005 无法创建表 errno:150“外键约束格式不正确”)

Laravel 迁移:“外键约束格式不正确”(errno 150)

MySQL + Rails:errno:150“外键约束格式不正确”