Helpex - Trao đổi & giúp đỡ Đăng nhập
25

Tôi vừa tạo một dự án Laravel 4 mới và đang tìm thấy những điều kỳ lạ xảy ra với khía cạnh khóa ngoại của trình tạo lược đồ. Nếu tôi sử dụng ->foreign()phương pháp này trong bất kỳ quá trình di chuyển nào của mình, tôi gặp lỗi MySQL 150 và lỗi chung 1005. Theo tài liệu tại laravel.com/docs, hai kịch bản ở dưới cùng có hoạt động không? Có ai biết tại sao họ không?

Những điều sau đây hoạt động:

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

        $table->integer('region_id')->references('id')->on('regions');

        $table->string('name', 160);
        $table->timestamps();
    });

Nhưng hai điều này không hoạt động:

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

        $table->foreign('region_id')->references('id')->on('regions');

        $table->string('name', 160);
        $table->timestamps();
    });

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

        $table->integer('region_id');
        $table->foreign('region_id')->references('id')->on('regions');

        $table->string('name', 160);
        $table->timestamps();
    });
25 hữu ích 3 bình luận 25k xem chia sẻ
53

Kiểm tra idloại của bạn . Laravel 4 tạo một id tăng dần với int (10) không dấu. Nếu bạn tạo một số nguyên cơ bản và cố gắng đặt một khóa ngoại vào đó, nó sẽ không thành công.

Như được đề xuất trong tài liệu tại liên kết này , bạn nên tạo id nước ngoài với $table->unsignedInteger(YOUR_ID_NAME);để làm cho nó hoạt động.

53 hữu ích 4 bình luận chia sẻ
7

Ngoài ra một số câu trả lời cho câu hỏi này "Lỗi chung: 1005 Không thể tạo bảng" Sử dụng Laravel Schema Build và Foreign Keys

Tóm tắt các câu trả lời được liệt kê ở đó, bao gồm cả câu trả lời của tôi:

  1. Khóa ngoại thường yêu cầu InnoDb, vì vậy hãy đặt công cụ mặc định của bạn hoặc chỉ định rõ ràng $table->engine = 'InnoDB'; Nếu bảng của bạn đã được tạo và đã đặt mặc định thành MyISAM, bạn có thể cần phải thay đổi nó.

  2. Các khóa ngoại yêu cầu bảng được tham chiếu tồn tại. Đảm bảo rằng bảng được tham chiếu được tạo trong một lần di chuyển trước đó, trước khi tạo khóa. Hãy xem xét việc tạo các khóa trong một lần di chuyển riêng biệt để chắc chắn.

  3. Khóa ngoại yêu cầu kiểu dữ liệu phải đồng dư. Kiểm tra xem trường được tham chiếu có cùng loại hay không, có dấu hay không dấu, độ dài của trường có giống nhau (hoặc ít hơn) hay không.

  4. Nếu bạn đang chuyển đổi giữa di chuyển mã hóa thủ công và sử dụng trình tạo, hãy đảm bảo bạn kiểm tra loại id bạn đang sử dụng. Artisan sử dụng số gia tăng () theo mặc định nhưng Jeffrey Way dường như thích số nguyên ('id', true) .

7 hữu ích 1 bình luận chia sẻ
5

Đã có cùng một vấn đề ngày trước.

Gốc của vấn đề là: cột có khóa ngoại phải cùng loại với khóa đó. Và bạn có các loại khác nhau: INT / UNSIGNED INT

điều này làm cho id trở thành UNSIGNED INT

$table->increments('id');

và điều này làm cho region_id trở thành INT

$table->integer('region_id')->references('id')->on('regions'); 

Để giải quyết vấn đề này, hãy đặt region_id UNSIGNED INTcũng

$table->integer('region_id')->unsigned()->references('id')->on('regions'); 
                              ^^^^^^^^^ note here

Tài liệu của Laravel đã đề cập đến điều này:

Lưu ý: Khi tạo khóa ngoại tham chiếu đến một số nguyên tăng dần, hãy nhớ luôn đặt cột khóa ngoại không có dấu.

5 hữu ích 0 bình luận chia sẻ
2

Nó hoạt động, nhưng đôi khi bạn chỉ cần phải cẩn thận và cố gắng hiểu những gì đang xảy ra đằng sau hậu trường.

Như tôi đã nói trong bình luận của tôi. Khi bạn lần đầu tiên chạy di chuyển mà không tạo cột liên quan, các dịch vụ di chuyển Laravel đã tạo bảng của bạn và sau đó, khi bạn cố di chuyển lại, nó sẽ luôn đưa ra lỗi cho bạn biết rằng bảng đã tồn tại.

Vì vậy, bạn chỉ cần drop table areaschạy và chạy php artisan migratelại để sửa chữa tất cả.

BIÊN TẬP:

Tôi vừa tạo di chuyển của bạn (bên dưới) tại đây và nó đã hoạt động.

Như bạn có thể thấy, tôi không sử dụng MySQL, vì vậy nó phải là một vấn đề của MySQL. Kiểm tra tài liệu khóa ngoại MySQL để xem liệu siêu dữ liệu của bạn có phù hợp với các yêu cầu của InnoDB hay không: http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html .

<?php

use Illuminate\Database\Migrations\Migration;

class CreateAreasTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('regions', function($table)
         {
             // $table->engine = 'InnoDB';
             $table->increments('id');
             $table->string('name', 160)->unique();
             $table->timestamps();
        });

        Schema::create('areas', function($table)
        {
            // $table->engine ='InnoDB';
            $table->increments('id');

            $table->integer('region_id');
            $table->foreign('region_id')->references('id')->on('regions');

            $table->string('name', 160);
            $table->timestamps();
        });     
    }

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

}

Khóa ngoại trong vấn đề di chuyển Laravel 4

2 hữu ích 1 bình luận chia sẻ
1

antonio carlos đã đúng, trước tiên hãy đảm bảo rằng bạn đã tạo bảng tham chiếu cho khóa ngoại của mình.

trước tiên hãy thử di chuyển các bảng không có khóa ngoại, sau đó thực hiện một di chuyển khác gán các khóa ngoại. ở trạng thái này, laravel chắc chắn rằng (các) khóa tham chiếu đang tồn tại. và bạn không cần phải bỏ bàn trong các lỗi của nghệ nhân.

1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ mysql laravel laravel-4 , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading