34

基本的に、私はこの男と同じ問題を抱えていますが、テーブルプレフィックスを除いています。テーブルプレフィックスがないため、彼の修正は機能しません。http://forums.laravel.com/viewtopic.php?id=972

Laravelのスキーマビルダーを使用して次のようなテーブルを作成しようとしています。

Schema::create('lessons', function($table)
{
    $table->increments('id');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->timestamps();
});

Schema::create('tutorials', function($table)
{
    $table->increments('id');
    $table->integer('author');
    $table->integer('lesson');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->string('tagline')->nullable();
    $table->text('content')->nullable();
    $table->text('attachments')->nullable();
    $table->timestamps();
});

Schema::table('tutorials', function($table)
{
    $table->foreign('author')->references('id')->on('users');
    $table->foreign('lesson')->references('id')->on('lessons');
});

問題は、このコードを(/ setupルートで)実行すると、次のエラーが発生することです。

SQLSTATE[HY000]: General error: 1005 Can't create table 'tutorials.#sql-2cff_da' (errno: 150)

SQL: ALTER TABLE `tutorials` ADD CONSTRAINT tutorials_author_foreign FOREIGN KEY (`author`) REFERENCES `users` (`id`)

Bindings: array (
)

ウェブ上の投稿とLaravelのEloquent関係を設定する方法について入手可能な限られたドキュメントに基づいて、私は何が間違っているのかわかりません...

usersすでに存在し、であるフィールドidがありauto_incrementます。また、適切な関係(belongs_toおよびhas_many)を使用してモデルをセットアップしていますが、これが問題ではないことがわかる限り、データベースのセットアップです。DBInnoDBです。

外部キーで何が間違っているのですか?

4

13 に答える 13

81

私は同じ問題を抱えています。Laravelスキーマドキュメントの一番下にある次のメモに気づきました:

注:外部キーで参照されるフィールドは、自動インクリメントである可能性が非常に高いため、自動的に符号なし整数になります。unsigned()を使用して外部キーフィールドを作成してください。両方のフィールドが完全に同じタイプである必要があり、両方のテーブルのエンジンがInnoDBに設定されている必要があり、外部キーを使用するテーブルの前に参照テーブルを作成する必要があります。 。

私にとって、外部キーフィールドをそのように設定するとすぐに:

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

問題ありませんでした。

編集:また、外部テーブルのフィールドがすでに作成されていることを確認してください。作成されていない場合、同じエラーで失敗する可能性があります。

于 2012-12-12T00:50:56.413 に答える
14

これらが失敗の理由であるかどうかは100%わかりませんが、いくつかの指針があります。古いバージョンのmySQLをデータベースとして使用している場合、デフォルトのテーブル実装はmyISAMであり、外部キー制限をサポートしていません。スクリプトが外部キーの割り当てに失敗しているため、スキーマのcreateメソッドでこの構文を使用して、エンジンとしてINNODBが必要であることを明示的に指定することをお勧めします。

Schema::create('lessons', function($table)
{
    $table->engine = 'InnoDB';

    $table->increments('id');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->timestamps();
});

これにより、発生している問題が軽減されるはずです。

また、外部キーを後付けとして宣言することもできますが、適切なDBエンジンが設定されていることを簡単に確認できるため、初期スキーマ内に外部キーを作成します。

Schema::create('tutorials', function($table)
{
    $table->engine = 'InnoDB';

    $table->increments('id');
    $table->integer('author');
    $table->integer('lesson');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->string('tagline')->nullable();
    $table->text('content')->nullable();
    $table->text('attachments')->nullable();
    $table->timestamps();

    $table->foreign('author')->references('id')->on('users');
    $table->foreign('lesson')->references('id')->on('lessons');
});

これがあなたの問題を助ける/解決することを願っています。

于 2012-08-10T19:07:22.393 に答える
8

すでにリストされている回答の要約と私のもの:

  1. 外部キーは通常、を必要InnoDbとするため、デフォルトエンジンを設定するか、明示的に指定します

    $table->engine = 'InnoDB';
    
  2. 外部キーには、参照されるテーブルが存在する必要があります。キーを作成する前に、参照されるテーブルが以前の移行で作成されていることを確認してください。確実に、別の移行でキーを作成することを検討してください。

  3. 外部キーでは、データ型が合同である必要があります。参照されるフィールドが同じタイプであるかどうか、符号付きか符号なしか、長さが同じ(またはそれ以下)かどうかを確認してください。

  4. ハンドコーディングの移行を切り替えてジェネレーターを使用する場合は、使用しているIDタイプを確認してください。Artisanはデフォルトでincrements()を使用しますが、Jeffrey Wayはinteger('id'、true)を好むようです。

于 2013-09-20T10:49:43.543 に答える
6

私もこの問題に遭遇しました。

私が見つけた解決策は、別のテーブルがそれを参照する前に、外部IDが使用されているIDを含むテーブルを作成する必要があるということです。基本的に、テーブルを作成し、MySQLに別のテーブルの主キーを参照するように指示していますが、そのテーブルはまだ存在していません。

あなたの例では、最初に作成者とレッスンのテーブルを作成する必要があります。

テーブルが作成される順序は、職人と移行ファイルを作成した順序によって異なります。

私の意見では、すべてのテーブルのデータベースを空にし、移行ファイル名のタイムスタンプを変更して(または、それらを削除して正しい順序で再作成して)、作成者とレッスンのテーブルがチュートリアルテーブルの前に作成されるようにします。

于 2013-04-03T23:28:13.903 に答える
5

参照されているテーブルでテーブルタイプをInnoDBに設定するのを忘れたため、同じエラーが発生しました。

$table->engine = 'InnoDB';
于 2013-03-29T10:22:16.637 に答える
4

Laravel5、MySQL55、CentOS65

私の場合、エラーはこれと同じでした。

エラー:[Illuminate \ Database \ QueryException]
SQLSTATE [HY000]:一般エラー:1005テーブル'nabsh。#sql-5b0_e'を作成できません(errno:121)(SQL:テーブルusermeta追加制約usermeta_uid_foreign外部キー(uid)参照 usersid)カスケードの削除時)。

この問題の承認された回答に良いヒントが見つかりました: エラー:エラー1005:テーブルを作成できません(errno:121)

ヒント:他の場所ですでに使用されている名前で制約を追加しようとすると、このメッセージが表示されます。

私の場合、このエラーは、追加しようとした制約がすでにどこかに存在していることを意味します(ただし、どこにも表示されませんでした)。

出力エラークエリをコピーして、sequel pro内で実行しました。その後、同じエラーが再び表示されることを願っています。ヒントにあるように、制約名を別の名前に変更すると、エラーなしで影響を受けたため、laravel5 + MySQL55+CentOS65の制約名ビルダーに問題があります。

解決策:テーブルスキーマの外部メソッドで2番目のパラメーターを送信して、制約の名前を変更してみてください。

Schema::table('tutorials', function($table)
{
    $table->foreign('author')->references('id')->on('users');
    $table->foreign('lesson')->references('id')->on('lessons');
});

〜>

Schema::table('tutorials', function($table)
{
    $table->foreign('author', 'fk_tutorials_author')->references('id')->on('users');
    $table->foreign('lesson', 'fk_tutorials_lesson')->references('id')->on('lessons');
});

お役に立てば幸いです。私の場合は機能します

于 2015-10-04T20:21:25.670 に答える
1

最も簡単な方法は、外部キーチェックを無効にすることです。

DB::statement('set foreign_key_checks=0');

Schema::table( ... );

DB::statement('set foreign_key_checks=1');
于 2015-11-04T13:42:03.347 に答える
1

これは、YiiFramework1.xの移行でも起こりました。上記のLaravelソリューションと同様に、

  • スペルが間違っている(またはまだ存在していない)テーブル名
  • スペルが間違っている(またはまだ存在していない)列名
  • 異なるテーブルで使用されている同じデータベース内の重複する外部キー名
于 2016-01-22T16:48:05.500 に答える
1

外部キーを使用する場合は、外部キーが。であることを確認してくださいunsigned。これは私のために働いた

于 2016-02-29T16:40:25.990 に答える
0

Laravel5で私がしていることは次のとおりです。

// CREATING TABLE
Schema::create('your_table_name', function (Blueprint $table) {
    $table->engine = 'InnoDB';
    $table->increments('id'); // index field example sample
    $table->string('field2'); // some varchar/string field sample
    $table->integer('field3'); // some integer field sample
    $table->integer('field_some_table_id')->unsigned; //for field that contains foreign key constraint
});

// FOREIGN KEY CONSTRAINT
Schema::table('stock', function ($table) {
    $table->foreign('field_some_table_id')->references('id')->on('some_table')->onDelete('cascade')->onUpdate('cascade');
});

結論は以上です。私にとってはうまくいきます。

于 2015-12-10T04:09:13.520 に答える
0

Laravel 5.4では、次のように整数に符号なしフラグを指定する必要があります。

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('post_id');
        $table->text('title');
        $table->text('text');
        $table->integer('employee_post_id_number')->unsigned();
        $table->foreign('employee_post_id_number')->references 
        ('employee_id_number')->on('employees');
        $table->timestamps();
    });
}
于 2017-10-20T08:17:23.827 に答える
0

基本的に、移行コマンドは、テーブルに提供しているFK参照と一致しない順序でテーブルを作成するため、このエラーが発生します。

たとえば、usersテーブルのIDを参照するFKを作成する場合は、usersテーブルが存在する必要があります。

あなたの例では、最初に作成者とレッスンのテーブルを作成する必要があります。

そこで、このような順序でテーブルを1つずつ作成することでこれを解決しました。これにより、FKを既存のテーブルに正常に参照できます。PHPArtisanMigrationが順序を決定できないようにします。

もう1つの解決策は、移行コマンドで指定されたテーブルまたはタイムスタンプの名前を変更するだけです。

于 2020-12-08T21:38:47.593 に答える
0

使用することによって:

 $table->unsignedInteger('author');

それ以外の:

 $table->integer('author');

問題は解決されます。

問題は、int(10)変数が必要なときに、整数がint(11)変数を生成することです。unsignedIntegerはあなたのためにそれを作ります。

于 2021-09-28T06:30:22.257 に答える