运行迁移时如何修复外键错误
Posted
技术标签:
【中文标题】运行迁移时如何修复外键错误【英文标题】:How to fix foreign key error when running migration 【发布时间】:2020-04-20 15:38:57 【问题描述】:我不知道为什么它仍然不起作用并显示这个:
Illuminate\Database\QueryException : SQLSTATE[HY000]: 一般 错误:1005 无法创建表
db_rocnikovka
.books
(错误号:150 “外键约束的格式不正确”)(SQL:alter tablebooks
添加约束books_doba_foreign
外键(doba
) 参考druh_knihies
(id_druhu
))在 C:\xampp\htdocs\Rocnikovka\vendor\laravel\framework\src\Illuminate\Database\Connection.php:665
异常跟踪: 1 PDOException::("SQLSTATE[HY000]: 一般错误: 1005 无法创建 > 表
db_rocnikovka
.books
(errno: 150 "外键约束格式不正确")") C:\xampp\htdocs\Rocnikovka\vendor\laravel\framework\src\Illuminate\Database\Connection.php:459
2 PDOStatement::execute()
C:\xampp\htdocs\Rocnikovka\vendor\laravel\framework\src\Illuminate\Database\Connection.php:459
catch (Exception $e)
throw new QueryException(
$query, $this->prepareBindings($bindings), $e
);
第一张桌子
class CreateDruhKnihiesTable extends Migration
public function up()
Schema::create('druh_knihies', function (Blueprint $table)
$table->bigIncrements('id_druhu');
$table->string('nazev');
$table->timestamps();
);
public function down()
Schema::dropIfExists('druh_knihies');
第二张表
class CreateBooksTable extends Migration
public function up()
Schema::create('books', function (Blueprint $table)
$table->bigIncrements('id_book');
$table->string('nazev');
$table->string('autor');
$table->string('druh');
$table->unsignedInteger('doba');
$table->foreign('doba')->references('id_druhu')->on('druh_knihies');
$table->integer('pocet_stranek');
$table->timestamps();
);
public function down()
Schema::dropIfExists('books');
【问题讨论】:
创建books
表时druh_knihies
表是否存在?
【参考方案1】:
这里的问题是druh_knihies
中的id_druhu
被定义为bigIncrements
并且您将doba
创建为unsignedInteger
并且使用外键类型时应该完全相同。所以在这种情况下,而不是
$table->unsignedInteger('doba');
你应该使用
$table->unsignedBigInteger('doba');
【讨论】:
【参考方案2】:您的外键需要与它引用的键具有相同的类型。所以第二个表外键doba
需要改成这个,因为你在第一个表主键中使用BigIncrements()
。
$table->unsignedBigInteger('doba');
【讨论】:
以上是关于运行迁移时如何修复外键错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Doctrine/DBAL 迁移数据库时如何修复未知数据库错误?
LARAVEL 8:一般错误:使用外键运行迁移时发生 1005