SQLSTATE [HY000]:一般错误:1005无法创建表`Projectname`.`users`(errno:150“外键约束格式不正确”)[重复]

Posted

技术标签:

【中文标题】SQLSTATE [HY000]:一般错误:1005无法创建表`Projectname`.`users`(errno:150“外键约束格式不正确”)[重复]【英文标题】:SQLSTATE[HY000]: General error: 1005 Can't create table `Projectname`.`users` (errno: 150 "Foreign key constraint is incorrectly formed") [duplicate] 【发布时间】:2020-11-27 03:51:34 【问题描述】:
Schema::create('projects', function (Blueprint $table) 
    $table->id();
    $table->string('name');
    $table->timestamps();
);

Schema::create('users', function (Blueprint $table) 
    $table->id();
    $table->foreignId('project_id')->constrained();
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
);

Schema::create('tasks', function (Blueprint $table) 
    $table->id();
    $table->foreignId('user_id')->constrained();
    $table->string('name');
    $table->timestamps();
);

当我运行 php artisan migrate 时,仅创建 users 表,然后迁移过程停止...

SQLSTATE[HY000]:一般错误:1005 无法创建表 Projectname.users (errno: 150 "外键约束为 格式不正确”)(SQL:alter table users 添加约束 users_project_id_foreign 外键 (project_id) 引用 projects (id))

【问题讨论】:

将帮助我查看实际的 SQL。否则取决于 laravel 的人。 我给了你一个带有描述的答案,如果有帮助,那么将该答案标记为已接受 【参考方案1】:

您使用了constrained(),它倾向于查找表projectuser 而不是projectsusers。在这种情况下,您需要在constrained() 中指定表名。

Schema::create('projects', function (Blueprint $table) 
    $table->id();
    $table->string('name');
    $table->timestamps();
);

Schema::create('users', function (Blueprint $table) 
    $table->id();
    $table->foreignId('project_id')->constrained('projects');
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
);

Schema::create('tasks', function (Blueprint $table) 
    $table->id();
    $table->foreignId('user_id')->constrained('users');
    $table->string('name');
    $table->timestamps();
);

您可以通过here了解更多

【讨论】:

【参考方案2】:

查看您的 migration 目录,您将看到所有迁移文件,例如 2014_10_12_000000_create_users_table

您收到此错误是因为您的 projects_create_table 应该在 create_users_table 文件之前迁移。

默认情况下,laravel 将每个迁移文件名以date_time 格式命名,例如2014_10_12_000000_table_names.php,这样所有文件都可以串行迁移。 因此,将您的 create_users_table 文件名更改为 date_time,以便在 projects_create_table 之后进行迁移,例如:

2020_01_01_000000_create_projects_table.php
2020_01_01_000001_create_users_table.php

现在,如果你运行php artisan migrate,首先会创建projects 表,然后是users 表。

【讨论】:

以上是关于SQLSTATE [HY000]:一般错误:1005无法创建表`Projectname`.`users`(errno:150“外键约束格式不正确”)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE [HY000]:一般错误:1364 字段“标题”没有默认值

SQLSTATE [HY000]:一般错误:2053

PDO 错误:SQLSTATE [HY000]:一般错误:2031

SQLSTATE[HY000]:一般错误:在 Laravel 中迁移期间出现 1005

SQLSTATE [HY000]:一般错误:1364 字段 'uID' 没有默认值

SQLSTATE[HY000]:一般错误:1366 整数值不正确: