SQLite不会创建索引

时间:2017-09-12 16:22:53

标签: php laravel sqlite database-migration

我正在Laravel 5.4中进行一些数据库迁移。迁移在MySQL数据库中运行良好,但是对于测试我想使用SQLite但迁移失败。这是代码

public function up()
    {
        Schema::create('mapped_venues', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('upload_job_id')->nullable();
            $table->string('venue')->default('');
            $table->unsignedInteger('venue_id')->nullable();

            $table->timestamps();

            $table->index(['venue']);
        });

        Schema::create('mapped_teams', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('upload_job_id')->nullable();
            $table->string('team')->default('');
            $table->unsignedInteger('team_id')->nullable();

            $table->timestamps();

            $table->index(['team']);
        });
    }

当我运行php artisan migrate时,mapped_teams.team列上的索引未创建,但mapped_venues.venue上的索引是!!

$ sqlite3 database/database.sqlite 
SQLite version 3.19.3 2017-06-08 14:26:16
Enter ".help" for usage hints.
sqlite> .indexes mapped_teams
sqlite> .indexes mapped_venues
mapped_venues_venue_index
sqlite>

我还试图在单独的电话上创建索引

Schema::table('mapped_venues', function (Blueprint $table) {
            $table->index(['venue']);
        });
Schema::table('mapped_teams', function (Blueprint $table) {
            $table->index(['team']);
        });

但结果是一样的。有趣的是,当(错误地)我在创建表的调用中留下了索引$table->index['team'])的创建(所以,我有两个调用来创建索引)我得到了索引{{1}的错误已经存在。

我正在使用:

  • Laravel 5.4.36
  • Doctrine DBal 2.6.2
  • SQLite 3.19.3

2 个答案:

答案 0 :(得分:1)

调用索引函数时似乎有一点小错误(用它作为数组而不是函数):

    $table->index['venue'];

应该是:

    $table->index('venue');

答案 1 :(得分:0)

我实际上发现索引确实已创建。我有另一次迁移将team列重命名为mapped_team,我想首先删除索引

Schema::table('mapped_teams', function (Blueprint $table) {
    $table->dropIndex(['team']);
    $table->renameColumn('team', 'mapped_team');
    $table->index(['mapped_team']);
}

删除索引的行抱怨索引mapped_teams_team_index不存在。我已将我的迁移修改为不删除并重新创建索引,但只是将其重命名。结果是名为mapped_teams_team_index的索引仍然存在,但它现在正确地索引mapped_team列。这适用于Mysql和SQLite。