我需要为我的数据库使用外键但我不能这样做,在命令行中运行migration命令后,我收到此错误:
[Illuminate \ Database \ QueryException] SQLSTATE [HY000]:一般错误: 1215无法添加外键约束(SQL:alter table
samples
add 约束s amples_supplier_id_foreign外键(supplier_id
) 参考suppliers
(id
))[PDOException] SQLSTATE [HY000]:常规错误:1215无法添加 外键约束
样本迁移:
Schema::create('samples', function (Blueprint $table) {
$table->Increments('id',true);
$table->string('variety',50);
$table->integer('supplier_id')->unsigned();
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->string('lot_number');
$table->date('date');
$table->integer('amount');
$table->integer('unit_id')->unsigned();
$table->foreign('unit_id')->references('id')->on('unit');
$table->string('technical_fact');
$table->string('comments');
$table->string('file_address');
$table->integer('category_id')->unsigned();
$table->foreign('category_id')->references('id')->on('category');
$table->timestamps();
});
供应商迁移:
Schema::create('suppliers', function (Blueprint $table) {
$table->Increments('id',true);
$table->string('supplier',50);
$table->timestamps();
});
我尝试使用新的迁移样本,但不成功:
Schema::create('samples', function (Blueprint $table) {
$table->Increments('id',true);
$table->string('variety',50);
$table->integer('supplier_id')->unsigned();
$table->string('lot_number');
$table->date('date');
$table->integer('amount');
$table->integer('unit_id')->unsigned();
$table->string('technical_fact');
$table->string('comments');
$table->string('file_address');
$table->integer('category_id')->unsigned();
$table->timestamps();
});
Schema::table('samples', function($table) {
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->foreign('unit_id')->references('id')->on('unit');
$table->foreign('category_id')->references('id')->on('category');
});
我尝试将主键的长度修改为10,但再次失败
答案 0 :(得分:7)
订单很重要。
您希望确保您的"供应商"在尝试将该表上的列作为约束引用之前,表存在。
因此,如果您想在创建表格时设置外键约束,请确保创建" 供应商"首先迁移," 样本"之后的迁移:
php artisan make:migration create_suppliers_table --create=suppliers
php artisan make:migration create_samples_table --create=samples
...将架构代码添加到迁移文件中。然后:
php artisan migrate
如果您不想担心创建表的顺序,请先执行create_table迁移,不要使用外键约束,然后再执行一次迁移以添加外键。
php artisan make:migration create_samples_table --create=samples
php artisan make:migration create_suppliers_table --create=suppliers
php artisan make:migration alter_samples_table --table=samples <-- add your foreign key constraints to this migration file
...将架构代码添加到迁移文件中。然后使用:
进行迁移php artisan migrate
答案 1 :(得分:4)
最后为表格生成一个迁移,请记住,如果您觉得任何困难,只需将其命名为table_foreign_keys
Schema::table('samples', function($table) {
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->foreign('unit_id')->references('id')->on('unit');
$table->foreign('category_id')->references('id')->on('category');
});
将所有与此相关的外键放在最后并运行
答案 2 :(得分:1)
尝试这样
Schema::table('samples', function($table) {
$table->integer('supplier_id')->unsigned();
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->integer('unit_id')->unsigned();
$table->foreign('unit_id')->references('id')->on('unit');
$table->integer('category_id')->unsigned();
$table->foreign('category_id')->references('id')->on('category');
});
答案 3 :(得分:1)
KorreyD说真的! ,但是我创建了迁移,然后重命名了迁移以重新排序它们,它非常简单:
重命名之前:
供应商迁移:2015_08_ 21 _104217_supllier_table.php
样本迁移:2015_08_ 22 _102325_samples_table.php
重命名后:
样本迁移:2015_08_ 21 _102325_samples_table.php
供应商迁移:2015_08_ 22 _104217_supllier_table.php
我的问题解决了!因为供应商迁移在样本迁移之前运行
评论:我尝试使用反射器,重命名任何使用迁移名称的地方
答案 4 :(得分:0)
Schema::table('posts', function (Blueprint $table) {
$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
});
答案 5 :(得分:0)
每个人都是正确的,但是最简单的方法是照常创建迁移文件。您将拥有2019_01_21_123456_create_table_one_table.php ...
我都重命名了
2019_01_21_0010_create_table_one_table.php
2019_01_21_0020_create_table_two_table.php
2019_01_21_0030_create_table_three_table.php
2019_01_21_0040_create_table_four_table.php
现在,如果我需要在table_two之前和table_one之后添加迁移,只需将其更改为
2019_01_21_0015_create_table_five_table.php
现在迁移顺序将为
2019_01_21_0010_create_table_one_table.php
2019_01_21_0015_create_table_five_table.php
2019_01_21_0020_create_table_two_table.php
2019_01_21_0030_create_table_three_table.php
2019_01_21_0040_create_table_four_table.php