web-dev-qa-db-ja.com

Laravel 5.6:テーブルの作成に失敗しました

Laravelを初めて使用し、Schemaファサードを使用してテーブルを作成しようとしています。コマンドを使用して移行ファイルを作成します。

php artisan make:migration create_products_define_standards_table --create=products_define_standards

ファイルは次のとおりです。

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateStandardsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products_define_standards', function (Blueprint $table) {
            $table->increments('id');
            $table->string('code')->unique();
            $table->string('image');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products_define_standards');
    }
}

実際には、デフォルトのCreateUsersTableとほぼ同じ内容ですが、php artisan migrateを実行すると、次のようになります。

  • users 'テーブル(デフォルト)
  • migrations 'テーブル(デフォルト)

しかしnot

  • password_resets 'テーブル(デフォルト)
  • products_define_standards 'テーブル(カスタム)

php artisan migrate:freshで試しましたが、同じログが表示されます。

Dropped all tables successfully.
Migration table created successfully.

   Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

  at /home/whatever/whatever.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php: 664
  660:         // If an exception occurs when attempting to run a query, we'll format the error
  661:         // message to include the bindings with SQL, which will make this exception a
  662:         // lot more helpful to the developer instead of just the database's errors.
  663:         catch (Exception $e) {
  664:             throw new QueryException(
  665:                 $query, $this->prepareBindings($bindings), $e
  666:             );
  667:         }
  668: 
  669:         return $result;

  Exception trace:

  1   PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes")
      /home/whatever/whatever.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php : 458

  2   PDOStatement::execute()
      /home/whatever/whatever.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php : 458

この回答 を見つけ、composer dumpautoも実行しましたが、結果は同じです。

私は何かが足りないのですか?移行を別の場所に登録するために他に何かする必要がありますか?

4
Brigo

_AppServiceProvider.php_ディレクトリにある_app/Providers_を編集し、boot()メソッド内でデフォルトの文字列長を設定します。

_use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}
_
11
Sapnesh Naik

バージョン5.6では、2つのファイルを編集する必要があります。

最初

App/ProvidersディレクトリにあるAppServiceProvider.phpを編集し、boot()メソッド内でデフォルトの文字列の長さを設定します。

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

Config /database.phpディレクトリにあるdatabase.phpを編集します

mysql構成セクションの「engine」はnullであり、「InnoDB ROW_FORMAT=DYNAMIC」に置き換える必要があります

楽しんでいただければ幸いです。

1
Farhad

ここでの作業は、キー名(短いもの)を使用して2番目のパラメーターを渡すというアプローチでした。

$table->string('code')->unique(null,'unikcode');
0
Tiago Gouvêa

この問題に対する潜在的なより良い解決策を提案したいと思います。

Laravelの一部であるファイルを編集する必要はありません。代わりに、実際のデータベース照合順序とエンジンを編集してください。

MySQLまたはMariaDBのいずれかを使用していると思います。 phpMyAdminを使用し、空のデータベースを作成するときは、utf8mb4_unicode_ciを使用します(utf8_unicode_ciまたはutf8P_general_ciも正常に機能する場合があります)。

次に、デフォルトのデータベースエンジンをMyISAMではなくInnoDBに設定します(これは、phpMyAdminの[変数]タブでも実行できます。「エンジン」を検索してください。

人々が提案した他のソリューション-つまり、database.phpを編集してInnoDBを使用するようにすると、非常によく似た効果があります。しかし、MySQL/Mariaの最新バージョンshouldとにかく、箱から出してすぐにInnoDBを使用しています。

移行を実行すると、それ以上の変更を加えることなく正常に実行されます。

0
Psipherious