Laravel错误:SQLSTATE[42S01]:基表或视图已存在:1050表'categories'已存在



我无法弄清楚问题是什么,由于某种原因,两个表没有连接,我阅读了很多文章并尝试了很多东西仍然不起作用。

我想将帖子和类别表链接在一起,以便何时可以显示所发布的帖子中选择的类别。

public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->string('name');
$table->text('description');
$table->integer('category_id');
$table->integer('price');
$table->integer('currency_id');
});
}

类别

public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->string('name');
$table->bigInteger('post_id')->unsigned();
$table->foreign('post_id')->references('id')->on('posts');
});
}

这是我得到的错误:

SQLSTATE[42S01]:基表或视图已存在:1050 表 "类别"已存在(SQL:创建表categories(idBigint 无符号不为空 auto_increment主键,created_at时间戳空,updated_at时间戳空,namevarchar(255) not 空,post_idbigint 无符号 不为空)默认字符集 UTF8MB4 整理"utf8mb4_unicode_ci")

尝试使用migrate:refreshartisan 命令完全刷新数据库。

php artisan migrate:refresh --seed

可能是数据库迁移在数据库的migrations表中注册之前运行并失败。


问题:(到目前为止)

1)如上所述,migrate:refresh整理原始错误

2)$table->bigInteger('post_id')->unsigned();不起作用,因为posts.idinteger而不是bigInteger

溶液:

post_id定义更改为

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

它说类别表已经存在。所以你要做的是,如果你在dev env中,你可以删除表并尝试一下,或者你可以像下面的命令一样做。

像这样运行工匠,它会删除所有表并更新鲜地迁移。

php artisan migrate:fresh

这对我有用。

答案很简单,您必须将帖子表中的$table->increments('id')更改为$table->id(),因为外键必须引用消息所说的主键。

这里有一些提示给你

  • 您必须在posts表中使用bigIncrements而不是integer因为integer的长度是4字节,但bigIncrements8 字节,这可能会导致将来

    出现问题
  • 你可能喜欢使用这条线

$table->foreignId('post_id')->constrained();

相反

$table->bigInteger('post_id')->unsigned();
$table->foreign('post_id')->references('id')->on('posts');

为简单起见

虽然,这是一个过去的问题,但我找到了一个非常好和简单的解决方案;

  1. 检查您的类别和迁移后文件 检查您的迁移文件并检查public function uppublic function down是否正确tables_names,然后检查您的 http://localhost/phpmyadmin/index.php,然后转到您的数据库

  2. 检查迁移表 在数据库中,检查migrations表,如下所示 迁移表中某些行的图片,您会发现这两个表(帖子和类别)不在里面

  3. 复制迁移文件的名称转到laravel-app/database/migrations文件夹或 IDE 到名为迁移的文件夹,然后复制两个迁移文件的名称

  4. 创建新的迁移行并将复制的名称粘贴
  5. 回本地主机数据库迁移表,为两个复制的名称创建新行,并相应地以数字方式粘贴名称 和 然后再次运行迁移。它完成了

php artisan migrate

对我来说,问题是工匠/拉拉维尔缓存在迁移的地方 所以我跑php artisan optimize:clear它不再工作而没有错误

相关内容

最新更新